mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RP6 - ATMEGA32 externer interrupt??


Autor: Martin S. (martin91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!!!

Hab mir vor ein paar tagen einen RP6 roboter bei conrad gekauft. Der
arbeitet mit einem ATMEGA32L µC. Es sind zwar viele funktionen
mitgeliefert, aber ich versuch alles selber zu programmieren, währ ja
sonst nur der halbe spass :-)

Also ich versuche gerade die Radumdrehungen zu messen und das ganze
läuft über die externen interrups INT0 und INT1. der roboter soll eine
gewisse strecke zurücklegen und dann stehen bleiben.

Mein problem ist, dass das programm nicht in die ISR springt.

der Code:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int encl = 0;
int encr = 0;

ISR (INT0_vect)
{
  PORTB &= (0<<PB0);
  encl++;
}

ISR (INT1_vect)
{
  encr++;
}

int main (void)
{
  DDRB |= (1<<DDB0); //led zum test
  PORTB |= (1<<PB0);
  DDRD |= (1<<DDD4) | (1<<DDD5);
  PORTD |= (1<<PD4) | (1<<PD5);  //beide räder einschalten

  //interrupt initialisieren
  MCUCR = (0 << ISC11) | (1 << ISC10) | (0 << ISC01) | (1 << ISC00);
  GICR = (1 << INT1) | (1 << INT0);
  sei();

  while(1)
  {
    if (encl == 1000)
    {
      PORTD |= (0<<PD4);
      encl = 0;
    }
    if (encr == 1000)
    {
      PORTD |= (0<<PD5);
      encr = 0;
    }
  }
}

hab ich irgend etwas vergessen, oder falsch initialisiert??
Vielleicht hat oder hatte jemand das selbe problem??

bitte um hilfe!!!

danke
martin91

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke schon, dass in die ISR gesprungn wird (es spricht im Programm 
eigentlich nichts dagegen), allerdings hat das, was in der ISR gemacht 
wird, keinen Einfluss auf den Rest des Programms, weil die Zählvariable 
nicht volatile deklariert ist und dementsprechend im Hauptprogramm 
vermutlich die Abfrage wegoptimiert wurde...

Variablen, die sowohl im Hauptprogramm als auch in Interrupt Handlern 
verwendet werden, müssen volatile sein.

Autor: Martin S. (martin91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hat aber leider auch nicht geholfen...ich könnt mir sonst nur 
vorstellen, dass kein ordentliches rechtecksignal an den ports für die 
externen interrupst liegt. hab nur leider kein oszi um das zu 
überprüfen...

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PORTD |= (0<<PD4);
Das ist aua! Überlege mal, was passiert, wenn man irgendetwas mit einer 
0 verODERt! Und dann lies Dir den Artikel Bitmanipulation gründlich 
durch. Da steht, wie man Bits setzt und v.a. löscht.

Autor: Martin S. (martin91)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
stimmt 0 or 1 ist natürlich 1! habs verUNDet, hilft aber leider auch 
nichts...

Autor: Martin S. (keniff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hey Martin S ;-)

also dein ISR aufruf in die dazugehörige init funktioniert einwandfrei.

die ISR (INT0_vect) {} wird bei nem HIGH-Pegel an pin PD2 aufgerufen.

also der code sollte passen...

gruß Martin S.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.