Forum: Mikrocontroller und Digitale Elektronik AVRstudio5: ich werde wahnsinnig - Funktionen werden nicht aufgerufen


von T.B. (Gast)


Lesenswert?

Hallo Forum

ich werde wahnsinnig. Ich habe das AVRsudio 5 installiert und komme 
nicht weiter.

- Es werden keine Funktionen mehr aufgerufen
- Interrupt scheint nicht zu funktionieren
- Breakpoints interessieren nicht und führen nicht zu einer 
Unterbrechung

Ich probiere jetzt schon seit Tagen und komme nicht weiter. Da ich in 
keinem Forum irgendwelche Probleme bzw. deren Lösungen finde, vermute 
ich, dass ich zu blöd bin und den Wald vor lauter Bäumen nicht sehe.

ich habe folgenden Code, mittlerweile minimalisiert, da ich gar nicht 
voran komme:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
volatile uint8_t yy=0x03;
6
7
ISR(TIMER1_COMPA_vect)
8
{
9
  yy++;
10
}
11
12
ISR(TIMER1_COMPB_vect)
13
{
14
  yy +=2;
15
}
16
17
void timer_init(void)
18
{
19
  TCCR1B = (1<<CS11)|(1<<WGM12); // CTC
20
  OCR1A = 62500; // alle 0,5 sek
21
  OCR1B = 25000; // alle 200 ms
22
  TIMSK1 = (1<<OCIE1A)|(1<<OCIE1B); //Interrupt einschalten
23
}
24
25
26
int main(void)
27
{
28
  DDRB = 0xff; //PortB als Ausgang
29
        PORTB = ~0xfa; 
30
  
31
  TCCR1B = (1<<CS11)|(1<<WGM12); // CTC
32
  OCR1A = 62500; // alle 0,5 sek
33
  OCR1B = 25000; // alle 200 ms
34
  TIMSK1 = (1<<OCIE1A)|(1<<OCIE1B); //Interrupt einschalten
35
        //timer_init();
36
  
37
  PORTB = ~0x5a;
38
   sei();
39
   while(1)
40
    {    
41
    PORTB = ~(yy);
42
   }
43
}
Zur Erklärung:
PortB habe ich als Ausgang definiert und auf die LEDs von meinem STK600 
gelegt. mittlerweile dient mir PORTB zum Debuggen, da es anders nicht zu 
gehen scheint.
wenn ich den timer als funktion aufrufe (timer_init();) bleibt er bei 
PORTB = ~0xfa; hängen. Wenn ich die funktion auskommentiere und den 
Inhalt der Funktion ins programm schreibe (wie oben) ist mein programm 
in der Hauptschleife. Aber an yy ändert sich nichts.

hat jemand einen tipp für mich?

von Stefan ++ (Gast)


Lesenswert?

Hallo,

dass du Schwierigkeiten hast wundert mich nicht, denn das was du vor 
hast funktioiert so nicht!

Lies noch einmal das Datenblatt durch und schau genau wie der Timer 
wirklich funktioniert.
Deine ISR werden genau einmal aufgerufen und dann STOP und warum steht 
im Datenblatt.

von tip (Gast)


Lesenswert?

WGM13 Bit muss für CTC-Mode auch noch gesetzt werden, wenn ich mich 
nicht schwer irre. Guck mal im Datenblatt.

von tip (Gast)


Lesenswert?

Korrektur: Momentan hast du den CTC-Mode aber der TOP Wert liegt im 
OCR1A-Register.

von T.B. (Gast)


Lesenswert?

das ist alles nicht die antwort auf meine frage.
warum werden keine funktionen ausgeführt (timer_init();), aber der 
gleiche inhalt in der main läuft problemlos?

von Cyblord -. (cyblord)


Lesenswert?

Ich sehe nirgendwo einen Aufruf von timer_init. Poste doch mal den Code 
welcher nicht das tut was du willst. Wie soll man denn sonst sagen warum 
die Funktion nicht aufgerufen wird. Ausserdem die Frage, woher weißt du 
das sie nicht aufgerufen wird? Verlässt du dich da auf den Simulator? 
Hast du dafür die Optimierung ausgeschaltet?
Der Simulator macht einfach manchmal mist. Sowas muss man schon im 
Controller selber testen.

gruß cyblord

von Peter D. (peda)


Lesenswert?

Poste den Code compilierbar (0 Warnings, 0 Errors!) als Anhang, dann 
kann man ihn schnell mal durch den Simulator jagen.

Und sag vor allem erstmal, was für ein AVR das überhaupt ist!!!


Peter

von Lutz (Gast)


Lesenswert?

Sachen wie
> PORTB = ~0xfa;
> PORTB = ~0x5a;
> PORTB = ~(yy);
muten schon sehr skuril an und machen deshalb vermutlich nicht das, was 
sie sollen.
Sollte das doch so Absicht sein: Warum direkt, wenn es auch viel 
indirekter geht...

von Michael H. (michael_h45)


Lesenswert?

Wenn das z.B. invertierte LEDs sind, ist das so viel einfacher lesbar.
Abgesehn von deinen persönlichen Vorlieben hat das aber rein gar nichts 
mit der Richtigkeit des Codes zu tun.

Wenn du nur vermutest und selber nicht weißt, welche Sachen was tun, 
spar dir doch einfach den "Hinweis".

von JojoS (Gast)


Lesenswert?

in dem Code ist der Aufruf von timer_init() auskommentiert, dann darf 
das auch nicht aufgerufen werden.
Aber evtl. triffst du hier auf einen Standardfehler: Wenn die 
Compileroptimierungen eingeschaltet sind können Codeteile wegoptimiert 
oder umverteilt werden. Dann gibt es keine 1:1 entsprechungen von 
C-Codezeilen zu Assemblerbefehlen. Also zum Debuggen Optimierungen 
ausschalten und Disassembly Ansicht einschalten.

von T.B. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Und sag vor allem erstmal, was für ein AVR das überhaupt ist!!!

Sorry, der AVR ist der ATmega2560 auf meinem STK600

Lutz schrieb:
> Sachen wie
>> PORTB = ~0xfa;
>> PORTB = ~0x5a;
>> PORTB = ~(yy);
> muten schon sehr skuril an

T.B. schrieb:
> Zur Erklärung:
> PortB habe ich als Ausgang definiert und auf die LEDs von meinem STK600
> gelegt.

Die LEDs auf meinem Board werden invertiert angesteuert, die 
Schreibweise macht es besser lesbar.


cyblord ---- schrieb:
> Ich sehe nirgendwo einen Aufruf von timer_init.
--> siehe Teil 2, im ersten Teil war er auskommentiert


Den Code habe ich als erstes schon gepostet:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
volatile uint8_t yy=0x03;
6
7
ISR(TIMER1_COMPA_vect)
8
{
9
  yy++;
10
}
11
12
ISR(TIMER1_COMPB_vect)
13
{
14
  yy +=2;
15
}
16
17
void timer_init(void)
18
{
19
  TCCR1B = (1<<CS11)|(1<<WGM12); // CTC
20
  OCR1A = 62500; // alle 0,5 sek
21
  OCR1B = 25000; // alle 200 ms
22
  TIMSK1 = (1<<OCIE1A)|(1<<OCIE1B); //Interrupt einschalten
23
}
24
25
26
int main(void)
27
{
28
  DDRB = 0xff; //PortB als Ausgang
29
        PORTB = ~0xfa; 
30
  
31
  TCCR1B = (1<<CS11)|(1<<WGM12); // CTC
32
  OCR1A = 62500; // alle 0,5 sek
33
  OCR1B = 25000; // alle 200 ms
34
  TIMSK1 = (1<<OCIE1A)|(1<<OCIE1B); //Interrupt einschalten
35
  
36
  PORTB = ~0x5a;
37
   sei();
38
   while(1)
39
    {    
40
    PORTB = ~(yy);
41
   }
42
}
Code funktioniert eingeschränkt, Prozessor befindet sich in der main(), 
die ISR wird aber nicht ausgeführt

Aber:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
volatile uint8_t yy=0x03;
6
7
ISR(TIMER1_COMPA_vect)
8
{
9
  yy++;
10
}
11
12
ISR(TIMER1_COMPB_vect)
13
{
14
  yy +=2;
15
}
16
17
void timer_init(void)
18
{
19
  TCCR1B = (1<<CS11)|(1<<WGM12); // CTC
20
  OCR1A = 62500; // alle 0,5 sek
21
  OCR1B = 25000; // alle 200 ms
22
  TIMSK1 = (1<<OCIE1A)|(1<<OCIE1B); //Interrupt einschalten
23
}
24
25
26
int main(void)
27
{
28
  DDRB = 0xff; //PortB als Ausgang
29
        PORTB = ~0xfa; 
30
  
31
  timer_init();
32
33
  PORTB = ~0x5a;
34
   sei();
35
   while(1)
36
    {    
37
    PORTB = ~(yy);
38
   }
39
}
Code funktioniert nicht, bleibt vor timer_init(); hängen, LEDs leuchten 
"0xfa" und kommen also nicht bis nach "0x5a"

Warum?

von Cyblord -. (cyblord)


Lesenswert?

Hast du nach  PORTB = ~0x5a mal ein while(1) gemacht, damit die 
Ausführung nach diesem Befehl sicher anhält und du checken kannst ob 
dieser Befehl wirklich nicht ausgeführt wurde?

Ich denke eher er wird ausgeführt und durch die nachfolgenden Interrupts 
wird PORTB wieder verändert.

gruß cyblord

von JojoS (Gast)


Angehängte Dateien:

Lesenswert?

also im Simulator läuft es wunderbar, nach 200ms wird der OCI1B 
aufgerufen und nach weiteren 300ms der OCI1A. Dann schlägt der CTC zu 
und das Spiel geht von vorne los. yy zählt 3,5,6,8,... Dann wird wohl 
was mit deinen LEDs faul sein oder im AVRStudio ist der falsche 
Prozessor eingestellt (Projekt/Eigenschaften/Device).
Habe nur ein neues Projekt angelegt, AVRGCC - C executable, Proz. 
ausgeswählt, Cut&Paste deines Codes und fertig.
Ich erinnere micht das die Installation den AVRGCC nicht eingebaut hatte 
und dazu etwas nachinstallieren musste. Nicht das du versuchst für 
AT_X_Mega Code zu bauen?

von T.B. (Gast)


Lesenswert?

vielen dank schon mal für die rückmeldung, dass mein code zu 
funktionieren scheint.
aber da sind schon wieder folgenden probleme:
auf deinem bild sieht man, dass in der ISR 1B ein breakpoint ist, das 
funktioniert bei mir nicht, er ignoriert alle(!) breakpoints

von T.B. (Gast)


Lesenswert?

JojoS schrieb:
> Ich erinnere micht das die Installation den AVRGCC nicht eingebaut hatte
> und dazu etwas nachinstallieren musste. Nicht das du versuchst für
> AT_X_Mega Code zu bauen?

Was muss nachinstalliert werden? Wie bzw. wo finde ich das?

von Peter D. (peda)


Lesenswert?

T.B. schrieb:
> Code funktioniert nicht, bleibt vor timer_init(); hängen

Wohl eher, er kommt nicht mehr zurück.
Vielleicht falsches Target eingestellt und der Stackpointer und die 
Interruptvektoren zeigen in den Wald.


Peter

von T.B. (Gast)


Lesenswert?

So, ich habe jetzt auch noch mal ein neues Projekt angelegt, den Code 
(von dieser Website) kopiert und eingefügt (Name= Testprog.c) und 
versucht zu starten. Ohne Erfolg Jetzt bekomme ich folgende 
Fehlermeldung:
1
Testprog.c
2
    Invoking: AVR/GNU C Compiler
3
  Done executing task "RunCompilerTask" -- FAILED.
4
Done building target "CoreBuild" in project "Testprog.cproj" -- FAILED.
5
Done building project "Testprog.cproj" -- FAILED.
6
7
Build FAILED.

von T.B. (Gast)


Lesenswert?

Boah man!
Bei mir ist irgendwas verkorkst!
Ich habe jetzt noch einmal ein neues Projekt gemacht und noch einmal den 
Code von hier kopiert und die Fehlermeldung beim kompilieren war weg und 
es läuft wie wahrscheinlich auch bei JojoS.

Ich weiß nicht wo hier der Fehler liegt. Das Programm ist immer noch 
offen, kein neustart, keine weiteren Einstellungen vorgenommen. Ich kann 
den fehler nur noch nachvollziehen, wenn ich das alte Projekt öffne.

Ich vermute (weil das ist der einzige unterschied), dass es vielleicht 
am Speicherort liegt???

Auf jeden fall schon mal Danke an JojoS für die positive Rückmeldung, 
somit konnte ich Fehler im Programm ausschließen.

Meine Breakpoints funktionieren immer noch nicht, das Programm hält zum 
Debuggen nicht an.
Bis jetzt bin ich kein Freund von der Performance des neuen Studios.

von JojoS (Gast)


Lesenswert?

dieses Problem hatte ich nach der Installation:
Beitrag "AVR Studio 5: AVR-GCC Projekt nicht verfügbar"

aber der AVRGCC scheint ja vorhanden zu sein, sonst ginge ja garnix. Zu 
den Breakpoints: ich habe den Simulator gewählt, es ging nur um den 
Softwaretest. Das STK600 habe ich nicht, kann man damit überhaupt in 
Hardware debuggen?
Wenn das ursprüngliche Projekt nicht kompiliert dann muss doch was in 
den Projekteinstellungen faul sein, vergleiche doch noch mal 
Projekt/Eigenschaften/Device und /Debugging oder die anderen 
Einstellungen.

von JojoS (Gast)


Lesenswert?

wg. STK600 debuggen: ich möchte dir ja nicht den Tag versauen, aber u.a. 
steht hier:
Beitrag "JTAG mit STK600?"

darum häufen sich hier die Forumsbeiträge zu ARM Cortex M0/M3 :-)

von T.B. (Gast)


Lesenswert?

JojoS schrieb:
> wg. STK600 debuggen: ich möchte dir ja nicht den Tag versauen, aber u.a.
> steht hier:
> Beitrag "JTAG mit STK600?"
>
> darum häufen sich hier die Forumsbeiträge zu ARM Cortex M0/M3 :-)

Danke Jojo, das erklärt warum bei den breakpoints nicht angehalten wird.

Oh man, jetzt hat das STK 600 chon jtag, aber keine 
debuggingschnittstelle! Muss man das verstehen? Dann hätten Sie die auch 
weglassen können, genauso kann ich auch über ISP programmieren und spare 
mir sogar noch vier pins.

Das ist der hammer! Das erklärt zumindest einiges.

von Hä? (Gast)


Lesenswert?

Kann man also denn auf dem STK600 eine Debuggingsession starten, die 
dann aber nur programmiert und sonst nichts macht?
Das wäre ja äußerst irreführend wenn AVR Studio das Starten eines 
Features zulässt, aber keine Rückmeldung über die nicht erfolgreiche 
Ausführung gibt.

von JojoS (Gast)


Lesenswert?

Debugger und Programmiertool sind zwei verschiedene Paar Schuhe beim 
AVRStudio. Wenn kein HW Debugger gefunden wird dann bietet der Projekt 
Wizzard auch nur den Simulator an. Der wird bei T.B. vermutlich auch 
gestartet, aber der läuft natürlich nicht in Echtzeit. Bei mir dauert es 
auf einem i7 Notebook knappe 30s bis der erste Breakpoint erreicht wird 
wenn man 'Run' ausführt. Wenn man das Projekt mit Einzelschritt startet 
erscheint der gelbe Pfeil zur akt. Position im main, in der Titelzeile 
steht aber auch verwirrenderweise 'Debbuging' und nix von Simulation. 
Beim googeln findet man schnell weitere verärgerte STK600 User weil die 
HW schon JTAG debugging hergeben sollte.
Aber der Simulator ist trotzdem eine schöne Sache, sowas findet man 
dafür bei den low-Cost ARM Lösungen nicht. Und in der Simu kann man 
sehen das der Timer 1B Interrupt nicht alle 200ms aufgerufen wird 
sondern 200ms nach Timerstart bzw. CTC der nur durch Timer 1A Interrupt 
ausgelöst wird.

von T.B. (Gast)


Lesenswert?

Hallo,

um das Thema hier sauber abzuschließen, folgende Erkenntnisse im 
Zusammenhang mit
- AVRstudio 5
- STK600 incl. ATmega2560 auf Adapterplatine
- Anschluss über JTAG
- Betriebssystem: Windows 7

Erkenntnisse:
* Projekte können nicht im Netzwerk abgelegt werden (Build schlägt 
fehl), außer:
* Projekt kann im Netzwerk abgelegt werden, wenn das Netzlaufwerk 
verbunden wurde, z.B. Freien Ordner im Netzwerk mit Laufwerk M: 
verbinden
* STK600 hat eine JTAG Schnittstelle, hiermit kann aber nicht debuggt 
werden! Dazu benötigt man ein JTAG Debugger, wie z.B. JTAG MK III
* Man muss den AVRGCC installieren /installiert haben
* d.h. mit dem stk600 wird bei Breakpoints nicht(!) angehalten

von Peter D. (peda)


Lesenswert?

T.B. schrieb:
> * STK600 hat eine JTAG Schnittstelle, hiermit kann aber nicht debuggt
> werden!

Also wenn ich mir das STK600 in der AVRStudio-Hilfe ansehe:
1.2 Features
- JTAG programming of AVR and AVR32 devices
- ISP and JTAG programming of AVR devices in external target systems

Da steht nur Programming und nichts von Debugging.

Das ist eigentlich üblich, nur was drinsteht ist auch drin.
Irgendwelche weitergehenden Vermutungen des Benutzers sind in der Regel 
falsch.


Peter

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
Noch kein Account? Hier anmelden.