Forum: Mikrocontroller und Digitale Elektronik AVR- Studio- Simulator, startet neu


von Student (Gast)


Lesenswert?

Hallo ich habe folgendes Problem, wenn ich im AVR- Studio simuliere, 
startet es den den Controller neu, sprich er beginnt wieder in Main, 
allerdings werden die Werte im TCNT0- Register nicht resetet. Ich 
programmiere mit dem aktuellsten WinAVR in C, der Controller ist ein 
ATMEGA 162, mit der Quarzfrequenz 3.6864 MHz, welche auch im Debugger 
eingestellt ist, dürfte aber eigentlich nichts zur Sache tun, weil das 
selbige Problem auch bei 4.00 MHz auftritt. Der Neustart passiert 
meistens, bei der Folgenden Code- Sequenz:
1
void init_measurment ()
2
{
3
  //sicherstellen, dass kein Interrupt stört
4
  //PCINT 0 deaktivieren
5
  GICR&=~(1<<PCIE0);
6
  //TC2 Overflow interrupt deaktivieren
7
  TIMSK&=~(1<<TOIE2);
8
  //TC2 OC interrupt aktivieren
9
  TIMSK|=(1<<OCIE2);
10
  //TC2, prescaler 8
11
  TCCR2&=0x00;;
12
  TCCR2|=(1<<CS21);  
13
}
 die Funktion rufe ich folgendermaßen auf:
1
init_measurment();
 allerdings habe ich Funktionen bisher immer so aufgerufen, wenn die 
Parameterliste leer ist. Vielleicht hat noch jemand einen Link zum 
nachlesen, wie man Funktionen aufruft, weil ich entsinne mich dunkel, 
dass manche in der Parameterliste auch void Funktion (*variable) stehen 
haben...

Schon mal danke für Eure Hilfe

von Johannes M. (johnny-m)


Lesenswert?

An dem Funktionsaufruf ist zunächst mal nichts verwerfliches. Der Fehler 
wird vermutlich in dem Teil des Programms liegen, den Du nicht zeigst, 
bzw. in den Einstellungen in Makefile und Simulator.

von Magnus Müller (Gast)


Lesenswert?

1
  //TC2 OC interrupt aktivieren
2
  TIMSK|=(1<<OCIE2);

Hast du auch eine Interruptroutine dazu geschrieben?

von Student (Gast)


Angehängte Dateien:

Lesenswert?

Hilfe, ich bin am Verzeifeln, warum will das nicht gehen, mein Code ist 
nicht geheim, dachte nur, dass der Fehler vermutlich in diesem 
Ausschnitt liegen wird, also hier nocheinmal der komplette Code, im 
Anhang, vielleicht findet ja jemand das Problem, ich tue es leider 
nicht. Ein Makefile besitze ich nicht, bzw. besitzen schon, allerding 
verwende ich das vom AVR- Studio automatisch generierte.

von Student (Gast)


Lesenswert?

Hallo Magnus, nein das habe ich nicht, weil ich eigentlich nur das 
OutputCompare- Flag benötige. Ist es erforderlich, dass ich die 
InterruptRoutine dazu schreibe?
Wenn ja, reicht es aus einfach eine leere Routine zu schreiben?

von Magnus Müller (Gast)


Lesenswert?

Student wrote:
> Hallo Magnus, nein das habe ich nicht, weil ich eigentlich nur das
> OutputCompare- Flag benötige. Ist es erforderlich, dass ich die
> InterruptRoutine dazu schreibe?
> Wenn ja, reicht es aus einfach eine leere Routine zu schreiben?

Wenn du nur das OC-Flag benötigst, musst du nicht extra den Interrupt 
freigeben. Schlimmer noch: wenn du den Interrupt frei gibst, dann wird 
der Controller beim Auftreten des Interrupts den entsprechenden 
Interruptvektor anspringen. In diesem Falle gibt es dann 3 
Möglichkeiten:

1) Du hast einen entsprechenden Interrupthandler implementiert. Dieser
   Handler wird auch angesprungen und abgearbeitet --> OK

2) Du hast keinen entsprechenden Interrupthandler implementiert. Der
   Compiler setzt für diesen Interrupt ggf. einen Sprung auf den Pro-
   grammanfang --> sieht aus wie ein Reset --> nicht schön --> schlecht

3) Du hast keinen entsprechenden Interrupthandler implementiert. Der
   Compiler setzt für diesen Interrupt ggf. ein RETI ein, was bewirkt,
   dass der Controller nach einer "Pause" von wenigen Taktzyklen wieder
   seinen normalen Aufgaben nachgeht... --> wäre dann nicht ganz soo
   schlimm ;)

Ich werde an dieser Stelle bestimmt noch von anderen Forenmitgliedern 
korrigiert (die Ausführungen sind wahrscheinlich nicht gaaanz korrekt), 
aber im Prinzip dürfte Punkt 2 auf dein Programm zutreffen.

Gruß,
Magnetus

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.