www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt geht am Mega16 aber mit Mega 8 nicht


Autor: Jörn Ahrens (joerna)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy


Ich habe ein altes Programm an nem Mega16 benutzt, dass per RS232 Daten 
empfängt und diese per ISR verarbeitet hat.
Das gleiche Programm will jetzt an meinem Mega8 einfach keine ISR mehr 
auslösen und ich finde keinen Fehler..

Um es zu testen hab ich auch versucht, einfach mal was zu senden, wenn 
was ankommt, aber auch das funktioniert nicht.

DIE KOMMUNIKATION ansonsten funktioniert einwandfrei...

#define   F_CPU 8000000UL          // MP-Takt
#include  <avr/io.h>
#include  <stdio.h>
#include  <stdlib.h>
#include   <inttypes.h>
#include   <avr/interrupt.h>

#define BAUD     38400UL
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)

int main (void) 
{

...
sei();
..
}

ISR(SIG_UART_RECV) 
{
/*
    Mode = UDR;
    while (!(UCSRA & (1<<RXC)));
    MPWMa = UDR;
    while (!(UCSRA & (1<<RXC)));
    MPWM = UDR;
*/
    while (!(UCSRA & (1<<UDRE)));
    UDR = 0xFF;
}


Autor: 3348 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ja das gibt es immer wieder. Bein einen AVR kann man ein register 
noch mit IN & OUT ansprechen, bein anderen muss dass LDS & STS sein. 
Muss man alles nachschauen und notieren.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

aber nicht bei Mega8 und Mega16 in diesem Fall...

Ansonsten: merkt das der Compiler nicht?
Der Assembler merkt es doch auch...

Also nicht 3348, eher 0815.

Gruß aus Berlin
Michael

Autor: Jörn Ahrens (joerna)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ich kann eucht nicht ganz folgen! was muss ich korrigieren oder 
suchen?

in der io.h ist die ISR SIG_UART_RECV gleich bei Mega8&16...

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

Bewertung
0 lesenswert
nicht lesenswert
Das Programm muss für den ATMega8 compiliert werden! Du kannst nicht 
einfach ein Programm, das für einen µC compiliert wurde, auf einen 
anderen schreiben. Zumal in diesem Fall noch hinzukommt, dass der Mega16 
über der "magischen Grenze" von 8 KiB Flash liegt und dementsprechend 
erstens längere Interrupt-Vektoren hat als der Mega8 und zweitens andere 
Sprungbefehle und calls verwendet (bei bis zu 8 KiB Flash reichen 
relative Jump- und Call-Befehle aus, bei größeren Speichern müssen 
absolute Sprünge her).

Autor: Jörn Ahrens (joerna)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein ich habe schon nen eigenes neues Projekt geöffnet mit nem Mega8 und 
nur den Code reinkopiert.

ich steuere nur zwei Ventile (Port C) und ein Motor mit PWM an


hier mal alles:
#define   F_CPU 8000000UL          // MP-Takt
#include  <avr/io.h>
#include  <stdio.h>
#include  <stdlib.h>
#include   <inttypes.h>
#include   <avr/interrupt.h>

#define BAUD     38400UL
#define UBRR_BAUD  ((F_CPU)/(16*(BAUD))-1)

long int   n    = 0;
long int   n1    = 0;
double      ni      = 0;
long int  i    = 0;
long int   MPWM   = 0;
long int   MPWMa   = 0;
int     Mode   = 0;
int     F    = 0;
int     Fs    = 0;
int     iF    = 0;


int main (void) 
{

  UCSRB   |= (1 << TXEN) | ( 1 << RXEN );  // UART TX, RX einschalten
   UCSRC   |= ( 1 << URSEL )|( 3<<UCSZ0 );  // Asynchron 8N1
   UBRRH  = (uint8_t) (UBRR_BAUD>>8);      // USART Baud
    UBRRL  = (uint8_t) UBRR_BAUD;

  ADCSRA = _BV(ADEN) | _BV(ADPS1) | _BV(ADPS2);    

  sei();

  DDRC=0x0E;
  DDRB=0x03;
  
  TCCR1A= _BV(COM1A1) | _BV(WGM11)| _BV(WGM10);
  TCCR1B= _BV(CS11);
  OCR1AH= (unsigned int) (MPWM>>8); 
  OCR1AL= (unsigned int) (MPWM);
   PORTC=0x0F;
  
  for (;;) 
  {

    MPWM= (MPWMa)*256+(MPWM);
    
    
    F    = 0;
    Fs    = 0;
    iF    = 0;
    i    = 0;

  if (Mode == 0)  
  {
  MPWM = 0;
  OCR1AH= (unsigned int) (MPWM>>8); 
  OCR1AL= (unsigned int) (MPWM);  

  PORTC= 0x00;  
  }


  if (Mode == 1)    
  {
  PORTC= 0x0C;  
      
  OCR1AH= (unsigned int) (MPWM>>8); 
  OCR1AL= (unsigned int) (MPWM);
  }


  while (i < 40)
  {
  ADMUX = _BV(REFS1) | _BV(REFS0) ;        // AD Kanal A.0
  ADCSRA |= _BV(ADSC);              // AD Messung starten
  while (ADCSRA & _BV(ADSC))            // bis ein Wert eingelesen ist warten
  {}
  F = ADCW;
  Fs=Fs+F;
  i++;
    wait();
  }
  F=Fs/39;

    while (!(UCSRA & (1<<UDRE)));
    UDR = Mode;  
    while (!(UCSRA & (1<<UDRE)));
    UDR = (F>>8);  
    while (!(UCSRA & (1<<UDRE)));
    UDR = F;
  }
      
}

ISR(SIG_UART_RECV) 
{
    Mode = UDR;
    while (!(UCSRA & (1<<UDRE)));
    UDR = 0xFF;  
    while (!(UCSRA & (1<<RXC)));
    MPWMa = UDR;
    while (!(UCSRA & (1<<RXC)));
    MPWM = UDR;

}


Autor: Daniel C. (cecky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wenn du schon den Interrupt verwenden möchtest, solltest du vielleicht 
auch das RXCIE Bit im UCSRB-Register setzen.

Autor: Jörn Ahrens (joerna)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh vielen dank das hab ich vergessen. genau das hatte ich natürlich 
nicht aus dem alten Programm kopiert :-(

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.