Forum: Mikrocontroller und Digitale Elektronik Blinkende LED


von AVR Anfänger (Gast)


Lesenswert?

Habe gerade mein erstes Programm auf einem ATtiny25 zum laufen 
gebracht:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
  unsigned long int n = 0;
6
  DDRB |= 0x04;
7
  PORTB |= 0x04;
8
  while(1)
9
  {
10
    n++;
11
    if(n & 0x40000) PORTB |= (1<<2);
12
    else PORTB &= ~(1<<2);
13
  }
14
}
Das kann aber so nicht der Weisheit letzter Schluss sein, das müsste 
doch mit Timerinterrupt auch gehen!

Nur habe ich absolut keine Ahnung wie ich das in C programmieren 
könnte.
Kann mir das mal jemand zeigen?
Ich weiss, solche blöden Anfängerfragen nerven den einen oder anderen.
Bitte nicht hauen  :-)

von Gast (Gast)


Lesenswert?


von AVR Anfänger (Gast)


Lesenswert?

Sorry, so schlau bin ich noch nicht,
hat mal jemand einen Code-Schnipsel, wie ich den Timer auf 1 Sekunde 
setzen kann und dann Interrupt-routine.

von Link zu (Gast)


Lesenswert?

> Sorry, so schlau bin ich noch nicht,
Dann lese den Link und werde es. ;-)
> hat mal jemand einen Code-Schnipsel, wie ich den Timer auf 1 Sekunde
> setzen kann und dann Interrupt-routine.
Man hat dir den Weg gezeigt, gehe ihn nun bitte. Alles andere wäre 
sinnlos.

von AVR Anfänger (Gast)


Lesenswert?

Shit, keiner hilft einem!

von MeinerEiner (Gast)


Lesenswert?

Weil in dem Link alles bereits drinsteht. Ob du das da im Link liest 
oder hier, bleibt sich vom Informationsgehalt her gleich.

Lesen musste schon selber. Vorbeikommen und dir das Ding programmieren 
wird niemand.

von Stephan H. (stephan-)


Lesenswert?

Interruproutine schreiben
Main schreiben
Prescaler ausrechnen
Timer initialisieren
Interruptregister setzen
Timer starten und zuschauen

so ganz grob.

von AVR Anfänger (Gast)


Lesenswert?

Habe dieses jetzt zusammengestoppelt:
1
  TCCR1 = 0b00001110;  // Prescaler = CK / 8192
2
  TIMSK |= (1 << TOIE1);  // Timer1 Overflow Interrupt Enable
3
  sei();      // Enable Interrrupt
4
5
6
7
8
9
10
11
ISR(TIMER1_OVF_vect)
12
{
13
  PORTB ^= (1 << PORTB4); // Led an PB4 toggeln
14
}
Seltsam, es funktioniert, ich sollte mich freuen...
Aber ist es so auch OK?
Oder hab ich was vergessen?

von Vlad T. (vlad_tepesch)


Lesenswert?

man kann das ganze noch optimieren:
1
ISR(TIMER1_OVF_vect)
2
{
3
  PINB = (1 << PIN4); // Led an PB4 toggeln
4
}
edit:
das klappt nur bei den neueren AVRs

von AVR Anfänger (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> das klappt nur bei den neueren AVRs

Ist ATtiny25 ein neuerer AVR?
Anscheinend, den
1
PINB = (1 << PIN4); // Led an PB4 toggeln
läßt die LED an PB4 blinken.
Das Datenblatt der ATtiny25 sagt:
Writing a logic one to PINxn toggles the value of PORTxn, independent on 
the value of DDRxn.
Note that the SBI instruction can be used to toggle one single bit in a 
port.
1
staun(Bauklötze);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.