Hallo! Ich beschäftige mich erst seit kurzem mit Microcontrollern und meine erste Bekanntschaft ist die mit einem Atmel AVR ATMega128, allerdings wurden wir angewiesen, beim compilieren ATMega103 anzugeben, aus mir bisher unverständlichen Gründen. Aber wie auch immer, prinzipiell funktioniert alles wie es sollte. Ich wollte allerdings auch AVR Studio 4 zu Simulationen einsetzen und geniere mir daher ein .s-File, das allerdings Kommandos zu enthalten scheint, die das Studio nicht kennt. Wie ist das möglich? Das Studio kennt doch sowohl den ATMega128 als auch 103, und kompiliert habe ich immer mit avr-gcc. mfg Christian Der Vollständigkeit halber hier noch der Quellcode, das .s-File ist im Anhang. Im Endeffekt gibt es einen Kitt-artigen Effekt auf einem Bargraphen per simuliertem PWM. #include<io.h> #include<sig-avr.h> #include<stdlib.h> #include"DisplayExample.h" #include<interrupt.h> #include<inttypes.h> /*======================================*/ /* VARIABLES placed within SRAM memory */ /*======================================*/ uint8_t i = 0; uint8_t intcount = 0; uint8_t output = 0XFF; uint8_t values[] = {0, 0, 0, 0, 0, 0, 0, 0}; uint8_t temp[] = {0, 0, 0, 0, 0, 0, 0, 0}; void arraycount(k) { for(i = 0; i < 8; i++) { values[i] = 8-(abs(k-i)); } } void resettemp() { for(i = 0; i < 8; i++) { temp[i] = 0; } } void DisplayDigitAndPrepareNext() { if ((intcount & 0x0007)==0) { resettemp(); } for(i = 0; i < 8; i++) { if (temp[i] < values[i]) { temp[i]++; output=~output; output |= (1<<i); output=~output; } else { output |= (1<<i); } } } INTERRUPT(SIG_OUTPUT_COMPARE1A) { intcount++; outp(output,DISPL_DAT_OPORT); DisplayDigitAndPrepareNext(); } int main(void){ uint8_t count = 0; uint8_t k = 0; outp(0xFF,DISPL_DAT_OPORT); outp(0xFF,DISPL_DAT_DDR); sbi(TIMSK,OCIE1A); //enable output compare interrupts outp(0x20,OCR1AH); //time between writing out to LEDs outp(0x00,OCR1AL); //8192 = 555,76 us at 14,47 MHz count=0; sbi(TCCR1B,CS10); //counter reset after match with A (only timer/counter1) sbi(TCCR1B,CTC1); //starts counter sei(); // enable global interrupts count=1; //1 means count up, 0 means count down k=STARTVALUE; arraycount(k); DisplayDigitAndPrepareNext(); while(1) { if (intcount==225) { if (k==7) { count=0; } if (k==1) { count=1; } if (count==1) { k++; } else { k--; } intcount=0; arraycount(k); } } return 0; }
Wiso *.s-Files ? Ich arbeite zwar nicht mit dem Simulator, aber soweit ich weiss, simuliert man damit die *.hex-Dateien. In den Hex Dingern steht ja im Grunde nur der Asm-Code in Form von Zahlen, der Simulator kann das lesen und tut genau das, was der Controller machen würde. Die *.hex-Files kann man sogar durch Doppelklick direkt im Studio öffnen. Habe das gerade mal probiert. Mit dem Menü "Debug" kannst du den Simulator laufen lassen. Musst nur noch die Fenster, die die Register und so anzeigen hinzufügen. Henrik
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.