mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt einstellen "" Anfänger""


Autor: Mohi Mohi (Firma: Student) (mohi34)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
soweit ich weiss bei ATMEGA 16 in PD2" ist so eingebaut, wenn der 
Mikrocontroller eine Flanke(Positiv oder negativ) in PD2 bekommt, löst 
er eine Interrupt, leider in meinem Code Funktionniert das nicht..
ich bitte um Hilfe -> Hier ist mein Code

ISR(INT0_vect)
{
_delay_ms(10000);
PINA = ~ PINA;
}
int main(void)
{
    cli();

           DDRD  = 0x00;   // use all pins on port D for input
  DDRB  = 0xff;               // use all pins on PortB for output
  PORTB = 0x00;
  int i  = 0;
   while (1)
   {

  for (i = 0; i < 256; i++)
  {
  i = i << 1;
  _delay_ms(10000);
  PINB = i;
  PINA = ~ PINA;
  }
  }
  sei();
}

Autor: Emperor_L0ser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin,
du gibst die interrupts erst nach der while-schleife frei, so wie ich 
das sehe wird die nur nie beendet.
2. punkt zur interrupt routine selbst schau dir mal ganz dringend das 
tutoriel an: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

wenn ich mich recht entsinne kannst du dir das cli am anfang auch 
sparen, da bei programmstart alle interrupts aus sind. hatte damit 
gestern eine lange nacht, weil ich vergass die alle interrupts mit sli 
zu aktivieren.

mfg Emperor_L0ser

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

Bewertung
0 lesenswert
nicht lesenswert
> _delay_ms(10000);
...und das funktioniert überhaupt nicht (bzw. nur bei CPU-Takten unter 
26 kHz). Schau Dir mal die Dokumentation der _delay_XX-Funktionen in der 
libc-Doku an. Da steht, wieviel maximal geht (ist vom CPU-Takt 
abhängig).

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

Bewertung
0 lesenswert
nicht lesenswert
> PINB = i;
> PINA = ~ PINA;
Und das macht beim ATMega16 keinen Sinn, weil PINA und PINB 
Read-Only-Register sind.

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

Bewertung
0 lesenswert
nicht lesenswert
> PINB = i;
...Und außerdem machst Du die Schiebeoperationen in einem int. Die 
Portregister sind aber nur 8 Bit breit, wodurch bei der Zuweisung von i 
die vorderen 8 Bit von i weggeschmissen werden (selbst wenn Du anstatt 
PINB PORTB nimmst).

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

Bewertung
0 lesenswert
nicht lesenswert
...Und außerdem musst Du den Interrupt auch freigeben (kleiner Tip: Es 
gibt ein Bit im Register GICR, dem Du etwas Aufmerksamkeit schenken 
solltest. Zusätzlich muss eigentlich noch die Flanke, auf die der 
Interrupt reagieren soll, eingestellt werden). Also, 
AVR-GCC-Tutorial lesen, v.a. den Abschnitt über (externe) 
Interrupts. Und vielleicht mal einen Blick ins Datenblatt werfen. Und in 
die Doku vom Compiler bzw. der Bibliothek...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, wenn ich das richtig rate, dann hast du am Port A deinen
Mess-Ausgang.
Da waere es vernünftig, diese Port dann aber auch tatsächlich
als Ausgang zu konfigurieren.

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

Bewertung
0 lesenswert
nicht lesenswert
> for (i = 0; i < 256; i++)
>  {
>  i = i << 1;
Das macht auch nicht viel Sinn. Das "i++" und das "i = i << 1" 
beeinflussen beide die selbe Variable. Da kommt vermutlich nicht das 
raus, was Du willst.

Autor: Christoph Mmmmmmm (Firma: privat) (mauralix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich ist es ganz einfach die externen Interrupts zu verwenden. Man 
muss nur die Interruptquelle einschalten und das Event einstellen (also 
pegelwechsel,low...) und Interrupts allgemein aktivieren (sei())

Hier ein vollständiges Programm, getestet mit atmega8, dürfte aber 
ähnlich beim 16er gehen.

// Externe Interrupts

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdint.h>

ISR(INT0_vect) 
{
  PORTB = ~PORTB;
}


int main()
{
  DDRD = 0x00; // PortD inupt;
  PORTD = 0xff; // interne Pullups aktivieren
  
  DDRB=0xff; // PortB ausgang;

  MCUCR |= (1<<ISC00) & ~(1<<ISC01); // Interrupt0 , logical change (an pd2)
  GICR |= 1<<INT0; // ext. Interrupt0 aktivieren
  sei(); // Interrupts allgemein freischalten

  while(1);

  return 0;
}

Autor: Mohi Mohi (Firma: Student) (mohi34)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen vielen Danke für euch alle... war sehr behilflich

Autor: mohi34 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen;
kann man  überhaupt eine Interrupt mit Winavr simulieren

Autor: mohi34 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
entschuldigung ich wollte Avr Studio 4 meinen

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

Bewertung
0 lesenswert
nicht lesenswert
Selbstverständlich kann man das.

Autor: Christoph Mmmmmmm (Firma: privat) (mauralix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupts lassen sich natürlich gut mit dem avrstudio simulieren. Den 
ADC kann man leider nicht so gut simulieren, oder wisst ihr wie das 
geht? Auch zyklisch kann man nicht so gut debuggen. Wenn ich das mache 
aktualisiert sich die Register und I/O Ansicht nicht. Erst wenn ich den 
Stop-Button drücke. Das ist bei Keil besser.

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.