mikrocontroller.net

Forum: Compiler & IDEs Atmega32 und ADC Interruptfunktion klappt nicht


Autor: Atmega32 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mikrocontroller.net
ich bin gerade dabei den Atmega32 zu programmieren.
Ich habe auch schon den ADC zum laufengebracht allerdings nur mit dem 
"Pollingverfahren". Nun wolte ich mal die Interrupts benutzen, aber dies 
will nicht ganz funktionieren.

Ich habe keine keine Ahnung wo der Fehler liegt.
Hier mal mein Quelltext:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

unsigned int adwert = 100;

//--------------------------
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 1600000 definiert"
#define F_CPU 16000000UL 
#endif
#include <util/delay.h> 
//--------------------------
void waitms(unsigned int ms)
{
    for(; ms>0; ms--) _delay_ms(1);
}
//--------------------------

int main (void)
{
  DDRA = 0xc0;
  ADMUX = 0x24;
  SFIOR = 0x00;
  sei();
  ADCSRA = 0xC4;

  while(1)
  {  
   PORTA = 0x80;  
   waitms(adwert);
   PORTA = 0x40;
   waitms(adwert);
   }
  return(0);    
}

ISR(ADC_vect)
{
  adwert = ADCH;
  ADCSRA = 0xC4;
}

Vielen dank schonmal.
MfG Atmega32

Autor: Edi R. (edi_r)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was mir auf Anhieb auffällt:

- "adwert" ist nicht volatile deklariert
- "adwert" ist ein int, aber es reicht ein char, weil ADCH auch nur 8 
bit breit ist.

Mehr fällt mir auf Anhieb nicht auf, weil die Initialisierungen recht 
nichtssagen sind (ADCSRA = 0xC4 ???) und ich keine Lust habe, die 
Hexwerte manuell zu zerpflücken.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Edi R. schrieb:
> (ADCSRA = 0xC4 ???) und ich keine Lust habe, die
> Hexwerte manuell zu zerpflücken.

Zustimmung.  Wäre die 0xc4 in Einzelwerten (Bits mit Benennung) 
ausgeschrieben, wäre dem TE wahrscheinlich vor dem Absenden schon klar 
gewesen, dass dort (1<<ADIE) fehlt und dieser Fehler hätte vermieden 
werden können.

Autor: Atmega32 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe den fehler auch gerade gefunden.
Hier der funktionierende Quelltext:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile unsigned int adwert = 100;

//--------------------------
#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun mit 1600000 definiert"
#define F_CPU 16000000UL  
#endif
#include <util/delay.h>    
//--------------------------
void waitms(unsigned int ms)
{
    for(; ms>0; ms--) _delay_ms(1);
}
//--------------------------

int main (void)
{
  DDRA = 0xc0;
  ADMUX = 0x24;
  SFIOR = 0x00;
  sei();
  ADCSRA = 0xC8;

  while(1)
  {  
     PORTA = 0x80;  
     waitms(adwert);
     PORTA = 0x40;
     waitms(adwert);
   }
  return(0);    
}

ISR(ADC_vect)
{
  adwert = ADCH;
  ADCSRA = 0xC8;
}


@ Hc Zimmerer
--------------
Ich weis den Fehler hätte man vermeiden können, jedoch muss man beachten 
das ich erst seit heute den Atmega32 programmiere und dadurch noch nicht 
viel Ahnung habe.

MfG Atmega32

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ging mir darum, dass Code selbsdokumentierend gestaltet wird, wenn es 
möglich ist, statt dem Leser die Bitklamüserei zu überlassen.  Dass also
statt
ADCSRA = 0xC8;  //SO NICHT
besser
ADCSRA = (1<<ADEN) | (1<<ADSC) | (1<<ADIE);
geschrieben wird.  Dann wäre Dir auch sofort aufgefallten, dass Du 
soeben nicht nur den Interrupt Enable dazugemacht, sondern auch den 
Taktvorteiler gegenüber der ersten Version geändert hast.

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.