www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Nejasnosti glede USI na attiny2313

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Pon Maj 20, 2013 3:26 pm    Naslov sporočila:  Nejasnosti glede USI na attiny2313 Odgovori s citatom

A imamo koga, ki se je kaj okvarjal z USI protokolom, ki je v uporabi na določenih, kolikor je meni znano, tiny avr-jih, in služi kot nadomestilo za vsem znan SPI standard? Glede na to, da s pomočjo google nisem uspel najt kakih uporabnih informacij, morda niti ne bi predstavljal težave in se tukaj po možnosti zaman na dolgo razpisoval dokler se ne ugotovi, če ima kdo sploh kako izkušnjo. Na kratko: Poskušam simulirati SPI z uporabo USI na čipu attiny2313, vendar mi določene stvari niso jasne oz. mi ne delujejo tako, kot naj bi glede na datasheet.

V pričaovanju ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dejko1
Član
Član



Pridružen-a: Ned 16 Mar 2008 0:21
Prispevkov: 271
Aktiv.: 1.29
Kraj: Ljubljana

PrispevekObjavljeno: Pon Maj 20, 2013 3:49 pm    Naslov sporočila:   Odgovori s citatom

S čim pa imaš težave? Predlagam da daš kakšen primer kaj želiš naredit in kako si se tega lotil. Na daljavo in brez dodatnih informacij ti nihče ne bo mogel pomagat.

Če stvari ne delujejo kot piše v datasheetu lahko pogledaš errata, samo v večini primerov bo problem na tvoji strani...

USI je vmesnik ki ga lahko uporabiš za SPI ali I2C komunikacijo.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Pon Maj 20, 2013 9:41 pm    Naslov sporočila:   Odgovori s citatom

Moj problem je sledeč: Prek USI-ja želim krmiliti en čip, konkretno DAC MCP4802, ki ima 16-bitni kontrolno-podatkovni register (prvi štirje biti so kontrolni, naslednjih osem je podatkovnih, preostali štirje pa pri tem modelu nimajo pomena). Bite naj bi se shiftalo v ta DAC na pozitivnih edge-ih clocka, ki mislim, da ne sme presegati hitrosti 1MHz. Vse lepo in prav. V dotičnem USI registru na MCU-ju postavim bite (bita 3 in 2 v registru USICR), ki določijo Timer/Counter0 overflow kot clock source za pomik bitov v shift 8-bitnem shift registru na MCU-ju in pa za inkrementacijo 4-bitnega USI counterja, katerega overflow povzorči pač nek flag v status registru (USISR), kar naj bi zaznamovalo konec prenosa. Kot clock source za clock, ki ga je potrebno "vsiliti" DAC-u v tem primeru sem si pa umislil ta isti timer/counter, ki poleg prej omenjenega ob overflowu sproži interrupt, ta pa postavi bit 0 v že prej imenovanem USICR registru, s čimer se povzroči, da se dotični pin dvigne na visok nivo oz. nizek. Kar je tukaj problem, je to, da se biti v shift registru pomaknejo na vsak overflow counterja, prav tako se za ena poveča stanje v 4-bitnem USI counterju ob vsakem overflowu, en clock pa se zgodi šele na vsak drug overflow counterja. Ni problema, sem si rekel, bom jaz Timer/Counter0 dopovedal naj na polovici štetja svojega območja sproži še en interrupt, ki bo generiral clock, torej bo clock dvakrat hitrejši. Tako bi se biti dejansko shiftali na pozitivnih edge-ih clocka, kot se morajo. Kar me tukaj moti, je to, da timer nikakor noče sprožit interrupta na polovici svojega ombočja, čeprav sem nastavil ustrezno vrednost v enem izmed compare registrov, pa še nekako je tisti 4-bitni USI counter zgubil svoj pomen, ker namesto štetja vsakega clock edge-a šteje vsak shiftan bit, ki pa bi se moral zgodit na vsak clock cycle (in ne clock edge), ki pa ga sestavljata dva clock edge-a (positive, negative oz. rising, falling) in counter tako prešteje samo do 8. Jaz se si rekel, da bi v svojem primeru lahko to celo izkoristil glede na to, da moram itak prenesti 16 bitov, torej 2 krat po 8 bitov. Svojo kodo prilagam v naslednjem postu, ker programiram na drugem računalniku Very Happy
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Pon Maj 20, 2013 9:51 pm    Naslov sporočila:  koda Odgovori s citatom

Ne mi rečt, da sem zloudal nedelujočo kodo zato, ker so komentarji napisani v ang. Kodo sem napisal sam, pišem pač komentarje v ang., vem pa, da je nedelujoča in to iz prve roke ... Very Happy

Koda:

/*
 * vox_ldr_driver_controller.c
 *
 * Created: 18.5.2013 16:03:02
 *  Author: krispi_rolls
 */

#define F_CPU 1000000

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsigned int send16BitsToDAC(unsigned int input);

char resume = 0;
int data[3];

int main(void)
{
   DDRB |= 0xC0;
   DDRD |= 0x28;
   PORTB |= 0x80;
   PORTD |= 0x28;
   USICR |= 0x54;
   
   send16BitsToDAC(0b0000000011111111);
   
    while(1)
    {
        //TODO:: Please write your application code
      //_delay_ms(1000);
    }
}

unsigned int send16BitsToDAC(unsigned int input)
{
   int i;
   unsigned int n = 1;
   for(i=0;i<8;i++)
   {
      data[0] += (input & n);
      data[1] += ((input>>8) & n);
      n = n*2;   
   }
   
   cli();   //Disable global interrupts
   PORTD &= ~(0x20);   // SW Simulated CS pin to low
   TCNT0 = 0x00;   // Clear timer/counter0 register
   TCCR0B |= 0x05;   //   Select prescaler
   TCCR0A |= 0x02;   // Set counter to CTC mode
   //TIFR |= 0x02;   // Clear Timer/Counter0 OVF flag
   TIMSK |= 0x06;   // Timer/Counter0 OVF interrupt enable
   OCR0A = 0xFE;   // Set top value for counter to count to
   OCR0B = 0x7F;
   //data[2] = USIDR;
   USIDR = data[1];   // Pass 8 MSB bits to usi data register
   //USISR |= 0x40;   // Clear USI counter OVF interrupt flag
   _delay_ms(150);   // Delay in accordance with USI protocol (at least half of a clock cycle)
   sei(); // Global interrupts enabled
   
   while(!resume);   // Wait until first 8 bits are transfered, so for USI counter to count up to 7 (decimal)
   USIDR = data[0];   // Pass the rest of the data to usi data/shift register
}

ISR(TIMER0_COMPB_vect)
{
   USICR |= 0x01;
}

ISR(TIMER0_OVF_vect)
{
   if((USISR & 0x0F) == 0x07)   // Check whether the USI counter has already counted up to 7
   {
      _delay_ms(150);
      resume++;
   }   
}

ISR(USI_OVERFLOW_vect)
{
   _delay_us(8);
   TCCR0B = 0;   // Prevent the counter from counting
   PORTD |= 0x20;   // Rise the implemented CS/SS (chip select/slave select) pin
   resume = 0;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Sre Maj 22, 2013 9:12 am    Naslov sporočila:   Odgovori s citatom

Precej zadovoljen bi bil že, če bi mi kdo pomagal rešit samo ta problem z TIMER0_COMPB interruptom, ki se proži ob ujemajoči primerjavi z registrom OCR0A namesto z OCR0B. Kot rezultat imam še zmeraj isto hiter clock, čeprav sem ga zapakiral v drug "interrupt", ki naj bi se prožil glede na primerjavo z OCR0B, ki ima dvakrat manjšo vrednost od OCR0A, torej dvakrat hiterje, pa se ne.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dejko1
Član
Član



Pridružen-a: Ned 16 Mar 2008 0:21
Prispevkov: 271
Aktiv.: 1.29
Kraj: Ljubljana

PrispevekObjavljeno: Sre Maj 22, 2013 1:24 pm    Naslov sporočila:   Odgovori s citatom

V novejših avr studijih boš moral spremenljivke ki jih spreminjaš z več mest definirat kot volatile (tudi v starejših verzijah ne bo nobene škode).

Priporočam da poskušaš poslat npr. 0b01010101 ne pa same ničle, ker ničel ne boš videl če pogledaš port z osciloskopom / logičnim analizatorjem.

V simulatorju se meni pri tem programu proži ISR(TIMER0_OVF_vect) ostali interrupti v tvojem programu pa ne, je pa res da sem poskusil samo z avr studio 4. Možno je tudi da določena periferija v simulatorju ni podprta.

Predlagam da če imaš kakšen prost GPIO port poskusiš v interruptih poslat nekaj nanj (npr da prižgeš led diodo na enemu pinu) pa boš takoj videl kateri deli ti delajo in kaj ti nagaja.

Definicija F_CPU nima vpliva na dejansko hitrost procesorja ampak pove kakšno hitrost ima kristal (no to verjetno tako veš).
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Sre Maj 22, 2013 8:05 pm    Naslov sporočila:   Odgovori s citatom

Kot rečeno se tudi ta interrupt izvede, amapak se proži ob ujemajoči se primerjavi timer0 z registrom OCR0A namesto OCR0B, kar rezultira v isti efekt, kot da bi kodo, ki jo sicer postavljam v ta interrupt, dal v tisti interrupt, ki ga sproži overflow timer-ja. Overflow je pa v tem načinu delovanja timerja itak odvisen od OCR0A, ki je referenca za TOP value. Očitno preveč pričakujem, namreč da bo tak čip deloval, kot je predvideno v datasheetu. Se moram očitno naučit potrpljenja v tem tinyAVR svetu (sem čisto svež namreč ... )
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dejko1
Član
Član



Pridružen-a: Ned 16 Mar 2008 0:21
Prispevkov: 271
Aktiv.: 1.29
Kraj: Ljubljana

PrispevekObjavljeno: Pet Maj 24, 2013 9:44 am    Naslov sporočila:   Odgovori s citatom

COMPA in COMPB vektorja glede na naslednji program vsekakor delujeta ok (malce drugače nastavljen timer mode).

https://github.com/teslaworksumn/headslave/blob/master/ServoController.c

Žal še vedno nisem našel časa da bi zadevo priklopil in sprobal.

Če nimaš osciloskopa lahko poskusiš naslednjo kodo (tudi z različnimi nastavitvami timerja):

Koda:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

volatile unsigned int i;

int main() {
   PORTB =0x00; // izhodi so portb0-2
   DDRB = 0x07;
 
   TCCR0B |= 0x05;   //   Select prescaler
   TCCR0A |= 0x02;   // Set counter to CTC mode
   TIMSK  = (1<<TOIE0) | (1<<OCIE0A) | (1<<OCIE0B);
   OCR0A = 0xFE;   // Set top value for counter to count to
   OCR0B = 0x7F;
   
      sei(); // Global interrupts enabled

   while(1) {
      i++;
   }
}

ISR(TIMER0_COMPA_vect)
{
   PORTB |= 0x01;
}

ISR(TIMER0_COMPB_vect)
{
   PORTB |= 0x02;
}

ISR(TIMER0_OVF_vect)
{
   PORTB |= 0x04;
}


Če ga imaš lahko spremeniš |= v ^= in lahko vidiš še fazne razlike med proženjem interruptov.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
krispi180
Neznanec
Neznanec



Pridružen-a: Tor 16 Apr 2013 16:54
Prispevkov: 6
Aktiv.: 0.04

PrispevekObjavljeno: Pet Maj 24, 2013 12:06 pm    Naslov sporočila:   Odgovori s citatom

Bom preizkusil zadevo danes zvečer, ko pridem domov. Sicer pa sem nekaj brskal po tujih forumih in ugotovil, če gre seveda verjeti tistim objavam, da v Clear Timer on compare načinu delovanja register OCR0B sploh ni aktiven. Če zadeva drži, pa mi ni jasno, kako je mogoče uporabljati ta timer kot clock source za usi. Namreč težko si kaj pomagam z zadevo, če mi zadeva shifta po en bit na pol clock cycle-a oz. po dva bita na cikel.

Hvala za tvoj trud dejko1, se oglasim, ko ugotovim, kaj novega.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group