Ich hab jetzt mehrer Stunden Datenblätter und foren gewälzt; Hier also mein Problem: Den Code im Anhang möchte ich auf einem ATMega 16 ausführen. Die Simulation Funktioniert wunderbar, beim interrupt Aufruf wird der Zustand des Ports geändert. Auf dem Controller nehmen die Pins dann jedoch nur den Zustand an den ich in main zugewiesen hab. Der interrupt an sich funktioniert (z.B. wenn ich ne Verzögerung in den Int einbaue). Nur der Zustand der Portpins will sich nicht ändern. Ich benutz das AVR Studio 4.12 SP3 und den GCC der mitgeliefert wurde. Programmieren geschieht dann mit TwinAVR mit dem ich das .hex file das das AVR Studio generiert per SPI in den Controller schreib. Wie man am Code Wahrscheinlcih sieht mach ich grade meine ersten Gehversuche mit dem MµC.
Sorry Bedienfehler, hier also der betreffenden Code:
1 | |
2 | #include <avr/io.h> |
3 | #include <stdint.h> |
4 | #include <inttypes.h> |
5 | #include <stdbool.h> |
6 | #include <avr/interrupt.h> |
7 | |
8 | void init (void); |
9 | |
10 | int main (void) |
11 | {
|
12 | init(); |
13 | |
14 | PORTA=0x15; |
15 | PORTC=0xff; |
16 | |
17 | while (1) |
18 | {
|
19 | }
|
20 | |
21 | }
|
22 | |
23 | void init (void) |
24 | {
|
25 | DDRA = 0xff; |
26 | |
27 | DDRC =0xff; |
28 | PORTC =0xff; |
29 | sei(); |
30 | TIMSK |= 0x01; // Timer 0 overflow interrupt enable |
31 | TCCR0 &= 0xF8; //unteren bits von timercontrolregister löschen |
32 | TCCR0 |= 0x05; //Prescaler 1024 |
33 | TCNT0 = 0x66; // Reload wert |
34 | |
35 | }
|
36 | |
37 | |
38 | ISR (TIMER0_OVF_vect) |
39 | {
|
40 | PORTC = 0x00; |
41 | TCNT0 = 0x66; // Reload wert |
42 | }
|
Laut Simulator müsste Port C irgenwqann komplett 0 sein, ist er aber in der Realen Schaltung nicht.
ich tipp mal drauf dass die Fuse JTAGEN falsch gesetzt ist und sich PortC noch im jtag Modus befindet
Was hat das mit einem nicht funktionierenden Interrupt zutun? Nichts! Roland hat liegt sicher richtig. Datenblatt ATmega16, Rev. 2466E–AVR–10/02, Seite 58ff. pumpkin
So Scheinbar stimmt die Adresse unter der der Compiler meinen ISR Code ablegt nicht! Wenn ich der ISR
1 | ISR(__vector_default) |
gebe funktioniert es. Wo muss ich Nachschauen um die richtige Syntax für die ISR () Funktion zu finden bzw. wie kann ich mir den Assemblercode anschauen um zu prüfen wo der Compiler meinen Isr Code im Speicher ablegt. Da ich auch im fertigen Programm nur einen Interrupt benutzen werde geht es so, schön isses aber nicht.
Du musst auch beim Linken -mmcu=atmega16 mit angeben, nicht nur beim Compilieren. Frag' ich mich aber, warum das dann in der Simulation gehen soll...
Danke erstmal Jörg! Wenns diemsmal mit dem Anhang klappt müsste sich die Meldung die ich beim erstellen der .hex datei bekomme darin befinden. Mir ist noch etwas aufgefallen: Laut Datenblatt hat der Timer 0 Overflow den Vector 10 in der iom16.h wird allerdings folgendes ersetzt
1 | #define TIMER0_OVF_vect _VECTOR(9)
|
Ausserdem ist mir nicht klar ob die Adressen der ISR's bei mir noch da liegen wo sie per Default liegen sollten.
ErdBaer wrote: > Wenns diemsmal mit dem Anhang klappt müsste sich die Meldung die ich > beim erstellen der .hex datei bekomme darin befinden. Sieht OK aus. > Mir ist noch etwas aufgefallen: Laut Datenblatt hat der Timer 0 Overflow > den Vector 10 in der iom16.h wird allerdings folgendes ersetzt >
1 | #define TIMER0_OVF_vect _VECTOR(9)
|
Ja, wir sind hier `off by one' mit dem Datenblatt. Ist aber nebensächlich. Bei avr-libc heißt der erste Interruptvektor eben __vector_1, das ist ja ein rein interner Name. Davor liegt noch der Resetvektor, aber der wird nicht über das __vector_N-Schema angesprochen.
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.