 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Pon Maj 20, 2013 3:26 pm Naslov sporočila: Nejasnosti glede USI na attiny2313 |
|
|
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 |
|
 |
dejko1 Član

Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 271 Aktiv.: 1.29 Kraj: Ljubljana
|
Objavljeno: Pon Maj 20, 2013 3:49 pm Naslov sporočila: |
|
|
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 |
|
 |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Pon Maj 20, 2013 9:41 pm Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Pon Maj 20, 2013 9:51 pm Naslov sporočila: koda |
|
|
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 ...
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 |
|
 |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Sre Maj 22, 2013 9:12 am Naslov sporočila: |
|
|
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 |
|
 |
dejko1 Član

Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 271 Aktiv.: 1.29 Kraj: Ljubljana
|
Objavljeno: Sre Maj 22, 2013 1:24 pm Naslov sporočila: |
|
|
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 |
|
 |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Sre Maj 22, 2013 8:05 pm Naslov sporočila: |
|
|
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 |
|
 |
dejko1 Član

Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 271 Aktiv.: 1.29 Kraj: Ljubljana
|
Objavljeno: Pet Maj 24, 2013 9:44 am Naslov sporočila: |
|
|
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 |
|
 |
krispi180 Neznanec

Pridružen-a: Tor 16 Apr 2013 16:54 Prispevkov: 6 Aktiv.: 0.04
|
Objavljeno: Pet Maj 24, 2013 12:06 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|