Alternativ till digitalwrite loop ?
Alternativ till digitalwrite loop ?
Jag behöver en klockpinne som ger ut en 4MHz fyrkantvåg, en Line Pulse pinne som togglar on/off en gång varje 180 klockpulser, och en First Line Marker pinne som togglar on/off en gång varje 400 Line Pulse pulser.
digitalwrite är ändå för långsamt för att generera min klocka, kommer bara upp i 80kHz, samt att göra allt i en enda lång digitalwrite loop blir tiotusentals linjer långt, vilket inte känns riktigt optimalt och säkerligen käkar upp mer minne på micron än nödvändigt.
Det är arduino det gäller, och inte rå avr/pic.
digitalwrite är ändå för långsamt för att generera min klocka, kommer bara upp i 80kHz, samt att göra allt i en enda lång digitalwrite loop blir tiotusentals linjer långt, vilket inte känns riktigt optimalt och säkerligen käkar upp mer minne på micron än nödvändigt.
Det är arduino det gäller, och inte rå avr/pic.
- Klas-Kenny
- Inlägg: 11840
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: Alternativ till digitalwrite loop ?
Det blir nog över huvud taget väldigt svårt att få till, även om du skulle skriva Assembly på en "ren" AVR..
De flesta Arduinos kör väl 16MHz klocka eller något sånt, det innebär alltså att du har fyra klockcykler på dig att utföra hela operationen. Det borde kunna gå att få ut en 4MHz fyrkantsvåg lite beroende på hur snabba instruktionerna i en AVR är (har dålig koll på dem), men då med noll tid till att utföra någonting annat. Och det är om du skriver ren Assembly, blir typ fyra rader kod (plus lite initialisering).
Men i form av en Arduino lär inte ens det gå.
Kort sagt, det går inte under dessa förutsättningar. Antingen får du ta till en snabbare processor (eller bara höja klockfrekvensen om det går) eller så får du gå någon väg runt det hela med lite frekvensmultiplicering utanför processorn.
Och glöm sen inte ta hänsyn till störningar, det ska till ohyggligt snabba flanker om du ska få till en snygg fyrkantsvåg på 4MHz, så att tänka till lite när det gäller sådant skadar ju inte.
De flesta Arduinos kör väl 16MHz klocka eller något sånt, det innebär alltså att du har fyra klockcykler på dig att utföra hela operationen. Det borde kunna gå att få ut en 4MHz fyrkantsvåg lite beroende på hur snabba instruktionerna i en AVR är (har dålig koll på dem), men då med noll tid till att utföra någonting annat. Och det är om du skriver ren Assembly, blir typ fyra rader kod (plus lite initialisering).
Men i form av en Arduino lär inte ens det gå.
Kort sagt, det går inte under dessa förutsättningar. Antingen får du ta till en snabbare processor (eller bara höja klockfrekvensen om det går) eller så får du gå någon väg runt det hela med lite frekvensmultiplicering utanför processorn.
Och glöm sen inte ta hänsyn till störningar, det ska till ohyggligt snabba flanker om du ska få till en snygg fyrkantsvåg på 4MHz, så att tänka till lite när det gäller sådant skadar ju inte.
Re: Alternativ till digitalwrite loop ?
Jag skulle nog fundera på om det inte vore vettigare att köra med en 4 MHz extern klocka och sen bara låta microcontrollern ha hand om de där var 180:e och 400:e puls-grejerna. Det går väl att låta en pinne klocka en räknare som ger interrupt var 180:e puls och den interruptrutinen får ha en egen räknare som ger en puls var 400:e interrupt.
Fast som sagt var, med en Arduino är det nog rätt kört ändå.
Fast som sagt var, med en Arduino är det nog rätt kört ändå.
Re: Alternativ till digitalwrite loop ?
Mja, vad jag fattar det sk ska SPI klockan klara att gå upp till systemklockans frekvens(16MHz) med en default på 4MHz.
och vid varje Line Pulse toggling (ca en klockpuls lång) så ska klockan skippa en puls, fast det blir ju iofs per automatik när man kör SPI mot ett skiftregister vilker jag kommer att göra.
Typ nät sånnt här:

Att fixa in 4-bit datan får bli en grej för sej, fast det är typ samma som på en matrissrivare, man skannar in texten/bilderna en horisontell linje av pixlar i taget.
Om en MSP430 på 16MHz klarar att driva en 320x240 lcd panel utan en extern sram( http://forum.stellarisiti.com/topic/484 ... #entry8248 ) ska ska jag fan klara en 720x400 panel MED ett extern sram och lite skift register på en rutten arduino duemilanove på 16 fesna MegaHertz, så det så!
och vid varje Line Pulse toggling (ca en klockpuls lång) så ska klockan skippa en puls, fast det blir ju iofs per automatik när man kör SPI mot ett skiftregister vilker jag kommer att göra.
Typ nät sånnt här:

Att fixa in 4-bit datan får bli en grej för sej, fast det är typ samma som på en matrissrivare, man skannar in texten/bilderna en horisontell linje av pixlar i taget.
Om en MSP430 på 16MHz klarar att driva en 320x240 lcd panel utan en extern sram( http://forum.stellarisiti.com/topic/484 ... #entry8248 ) ska ska jag fan klara en 720x400 panel MED ett extern sram och lite skift register på en rutten arduino duemilanove på 16 fesna MegaHertz, så det så!
- Krille Krokodil
- Inlägg: 4062
- Blev medlem: 9 december 2005, 22:33:11
- Ort: Helsingborg
Re: Alternativ till digitalwrite loop ?
Hmm, C pop & pushar ju som en massa på stacken vid avbrott så det tar väl en minst 80
klockcykler overhead typ har jag för mig... Och 80 klockcykler push-pop till för ett
funktionsanrop till digitalwrite() och sedan 100(0 ?) för att utföra den monstruösa funktionen.
Hade programmerat med avr-libc så hade du haft tillgång till push-pop-fria-avbrott: http://www.nongnu.org/avr-libc/user-man ... interrupts.
Det där blir väl 6 klockcykler eller något sådant.
klockcykler overhead typ har jag för mig... Och 80 klockcykler push-pop till för ett
funktionsanrop till digitalwrite() och sedan 100(0 ?) för att utföra den monstruösa funktionen.

Hade programmerat med avr-libc så hade du haft tillgång till push-pop-fria-avbrott:
Kod: Markera allt
ISR(TIMER1_OVF_vect, ISR_NAKED)
{
PORTB |= _BV(0); // results in SBI which does not affect SREG
reti();
}
Det där blir väl 6 klockcykler eller något sådant.
- Swech
- EF Sponsor
- Inlägg: 4750
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Alternativ till digitalwrite loop ?
Det där är bättre att implementera i en fpga eller ta en processor
som har stöd för rgb display. för det är troligt en 320x240 display
du tänker driva....
Swech
som har stöd för rgb display. för det är troligt en 320x240 display
du tänker driva....
Swech
Re: Alternativ till digitalwrite loop ?
Bara ett exempel jag hade liggandes för att få ut 4MHz.
Kod: Markera allt
void setup() {
unsigned char highval = 32;
unsigned char lowval = 0;
DDRB = 0xFF;
asm volatile (
"ioloop:\n\t"
"out %[portb], %[highval]\n\t"
"out %[portb], %[lowval]\n\t"
"rjmp ioloop\n\t"
:
: [portb] "i" (_SFR_IO_ADDR(PORTB)),
[highval] "a" (highval),
[lowval] "a" (lowval)
:
);
}
void loop(){
}
Re: Alternativ till digitalwrite loop ?
Har arduinon ingen timer som kan toggla pinnar direkt?
Re: Alternativ till digitalwrite loop ?
Jodå. 4MHz på pin 3.
Kod: Markera allt
const long frequency = 4000000L;
void setup()
{
pinMode (3, OUTPUT); // Timer 2 "B" output: OC2B (Pin 3)
TCCR2A = bit (WGM20) | bit (WGM21) | bit (COM2B1); // fast PWM, clear OC2A on compare
TCCR2B = bit (WGM22) | bit (CS20); // fast PWM, no prescaler
OCR2A = (F_CPU / frequency) - 1; // zero relative
OCR2B = ((OCR2A + 1) / 2) - 1; // 50% duty cycle
}
void loop()
{
}