www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATtiny 84 Timer unerklärlich langsam


Autor: Ralf G. (sense)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich benötige Mal jemanden, der mein geistiges Dickicht lüftet. Ich will 
5 LEDs ansteuern, in einem synchronen Takt über den Timer1 eines ATtiny 
84.
Außerdem will ich über ein Poti(1kOhm) einstellen können, wie schnell 
der Timer1 läuft. Der Ausgang des Potis geht auf PA5 und die LEDs hängen 
an PA0-PA4. Bis jetzt ist ja nichts schweres dabei, aber irgend läuft 
der Timer1 total langsam. Eigentlich müsste er bei 1MHz Clock, einem 
Prescaler von 1024 und ein OCR1A von 1023, ca. jede 1,xx Sekunde ein 
Interrupt haben. Dem ist aber nicht so anscheinend. Also davon 
ausgegangen, dass Poti ist so eingestellt, dass praktisch VCC anliegt.
VCC ist 3,0V (2*AA-Batterien die voll sind) und Brownout-Detection ist 
bei 1,8 V gesetzt.
Der Clockoutput-Pin ist aktiviert und ich messe dort 1MHz.
Hier der Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#define F_CPU 1000000
#include <util/delay.h>

#define ARRAY_SIZE 5

uint8_t step = 0;
const uint8_t figur_table[ARRAY_SIZE] PROGMEM = {(1<<PA0),(1<<PA1),(1<<PA2),(1<<PA3),(1<<PA4)};
int main()
{
  uint16_t adc_res = 0;
  DDRA = ((1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4));
  ADCSRA = (1<<ADEN);
  ADMUX = 0b000101;
  ADCSRA = (1<<ADSC);
  while(ADCSRA & (1<<ADSC));
  adc_res = ADCW;
  adc_res = 0;
  ADCSRA |= (1<<ADSC);
  while(ADCSRA & (1<<ADSC));
  adc_res = ADCW;
  TCCR1B = (1<<CS12)|(1<<CS10)|(1<<WGM12);
  TIMSK1 = (1<<OCIE1A);
  OCR1A = adc_res;
  //OCR1A = 100;
  PORTA = ((1<<PA0)|(1<<PA1)|(1<<PA2)|(1<<PA3)|(1<<PA4));
  _delay_ms(100);
  //PORTA &= ~(1<<PA0)|~(1<<PA1)|~(1<<PA2)|~(1<<PA3)|~(1<<PA4);
  PORTA = 0x00;
  sei();
  while(1)
  {
    ADMUX = 0b000101;
    ADCSRA |= (1<<ADSC);
    while(ADCSRA & (1<<ADSC));
    adc_res = ADCW;
  }

}
ISR(TIM1_COMPA_vect)
{
  if(step > ARRAY_SIZE)
  {
    step = 0;
  }
  PORTA = 0x00;
  PORTA |= pgm_read_byte(&figur_table[step]);
  PORTA ^= (1<<PA4);
  step++;
}

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.