Alternativ till digitalwrite loop ?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Alternativ till digitalwrite loop ?

Inlägg av Tekko »

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.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Alternativ till digitalwrite loop ?

Inlägg av Klas-Kenny »

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.
Nerre
Inlägg: 27229
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Alternativ till digitalwrite loop ?

Inlägg av Nerre »

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å.
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Re: Alternativ till digitalwrite loop ?

Inlägg av Tekko »

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:
Bild

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å!
Tekko
Inlägg: 9009
Blev medlem: 28 november 2004, 20:19:15

Re: Alternativ till digitalwrite loop ?

Inlägg av Tekko »

Bild
Användarvisningsbild
Krille Krokodil
Inlägg: 4062
Blev medlem: 9 december 2005, 22:33:11
Ort: Helsingborg

Re: Alternativ till digitalwrite loop ?

Inlägg av Krille Krokodil »

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:

Kod: Markera allt

ISR(TIMER1_OVF_vect, ISR_NAKED)
{
PORTB |= _BV(0); // results in SBI which does not affect SREG
reti();
}
http://www.nongnu.org/avr-libc/user-man ... interrupts.

Det där blir väl 6 klockcykler eller något sådant.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: Alternativ till digitalwrite loop ?

Inlägg av Swech »

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
Borre
Inlägg: 4609
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Alternativ till digitalwrite loop ?

Inlägg av Borre »

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(){
}
Användarvisningsbild
mri
Inlägg: 1165
Blev medlem: 15 mars 2007, 13:20:50
Ort: Jakobstad, Finland
Kontakt:

Re: Alternativ till digitalwrite loop ?

Inlägg av mri »

Har arduinon ingen timer som kan toggla pinnar direkt?
Borre
Inlägg: 4609
Blev medlem: 14 juni 2007, 15:43:50
Ort: Hälsingland

Re: Alternativ till digitalwrite loop ?

Inlägg av Borre »

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()
  {

  }
Skriv svar