mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny48 ADC und Interrupt


Autor: Clemens Huhn (Firma: Stahl AG) (clemensh)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,
mein erstes Projekt mit dem Tiny48 und C als Programmiersprache hat sich 
als einiges schwieriger herausgestellt als gedacht.
Vielleicht kann mir hier ja Jemand weiterhelfen.

Es handelt sich um eine Batterieüberwachung mithilfe eines Tiny48.
Spannung, Temperatur usw sollen verarbeitet werden.

Hardware passt soweit, aber bei der Software gibts noch zwei Hürden:

Zum einen löst der PC Interrupt von PC7 nicht aus.

Code dazu:

//Reset Interrupt PIN PC7 Initialisieren//////

PCICR |=0b00001111;
//PCICR |=(1<<PCIE0);//PCINT7-0 an
//PCMSK0 |=(1<<PCINT7);//Auswahl, PIN PC7 als interruptquelle
sei();//global interrupt an

ISR(PCINT0_vect)
  {
  Fehler=0;
  eeprom_write_byte((uint8_t*)0x10,5);//Fehlertyp=5,AllesOK resett
  PORTD=0b00001111;
  PORTD=0b11111111;
  }
______________________________________________________________________ 
_

Zum zweiten will der ADC noch nicht richtig, gibt Werte zwischen 0 und 
Maxwert 1024 aus, aber meistens so, das meine if Abfrage, selbst mit 
verschiedenen Werten, eintrifft:

//Alle I/O Ports auf Eingang/Ausgang//////////

DDRB  = 0b00000110;//Relais Ausgang PB1/2
DDRC  = 0b00000000;//PC6 zum Programmeingang PC7 resett eingang
PORTC = (PORTC&0b01111111); // pull down PC7
PORTD = (PORTD&0b10111111); // pull down -> offen

//////////////// ADC initialisieren ///Initialisierung mit 0 
/////////////

uint8_t ADC_init()
{
ADCSRA |= (1<<ADEN);//ADC aktivieren
ADCSRA |= (1<<ADPS1) | (1<<ADPS0);  // clock/8 Frequenzvorteiler 
ADPS2=8;
ADMUX |= (1<<ADLAR); //Left adjust result

// ADC Wert lesen und verwerfen
ADMUX = (ADMUX & (0b11110000)) | (Kanal & 0b00001111); //MUX0-5
ADCSRA |= (1<<ADSC);            // eine ADC Wandlung starten
while (ADCSRA & (1<<ADSC) );    // auf Abschluss der Konvertierung 
warten
return ADCW;

}

//////////// ADC Einzelmessung ///////////////////////////
uint16_t ADC_Read(uint8_t Kanal)
{

  ADMUX = ((ADMUX & 0b11110000) | (Kanal & 0b00001111)); //MUX0-5
  ADCSRA |= (1<<ADSC);            // eine ADC Wandlung starten
  while (ADCSRA & (1<<ADSC) );    // auf Abschluss der Konvertierung 
warten
  return ADCW;                   // ADC auslesen und zurückgeben
}

Der Aufruf aus der main() :

  Kanal=1;
      do {
          if(ADC_Read(Kanal)>=255)
            {PORTD=0b00000110;}
  }
  while(1);

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.