So in der Zwichenzeit habe ich mich ein wenig mit der Programmierumgebung etc. vertraut gemacht. Und habe auch schon erste Ergebnisse laufen.
Im Moment zählt der mega8 von 0 -9 und gibt die Zahl auf dem 7-Segment Display aus. Davon hab ich auch mal ein Bild gemacht.
Jetzt würde ich gerne noch eine LED an PB0 blinken lassen, über den Timer0.
Folgender Code funktioniert nicht, die ISR vom Timer0 wird einfach nicht aufgerufen.
Code:
/* Projekt: Drehzahlmesser
Anzeige der Drehzahl auf 5 7-Segment-Anzeigen.
Anzeigen werden im Multiplexverfahren angesteuert,
die Drehzahl alle 100ms aktualisiert.
Später sollen noch max. Drehzahlspeicherung sowie eine
Begrüßung beim Einschalten hinzukommen.
AUTOR: Benjamin Ruppert
DATUM: 01.11.2007 - gute Frage */
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include <avr/interrupt.h>
/* Variablendeklaration */
uint8_t SEGMENT; // Bit0 = Seg. a ... Bit6 = Seg. g
uint8_t Zahl;
/* Prototypendeklaration */
void ZahlInSegment(uint8_t);
// Konvertierung Zahl -> Segmentanzeige
void ZahlInSegment(uint8_t Zahl) {
switch(Zahl) {
// Segment: gfedcba
case 0: SEGMENT = 0b00111111; break;
case 1: SEGMENT = 0b00000110; break;
case 2: SEGMENT = 0b01011011; break;
case 3: SEGMENT = 0b01001111; break;
case 4: SEGMENT = 0b01100110; break;
case 5: SEGMENT = 0b01101101; break;
case 6: SEGMENT = 0b01111100; break;
case 7: SEGMENT = 0b00000111; break;
case 8: SEGMENT = 0b01111111; break;
case 9: SEGMENT = 0b01100111; break;
// Segment: gfedcba
}
PORTC = 0x00; // PC0 - PC5 auf 0
PORTB &= ~(1 << 1); // PB1 auf 0
// Ausgänge setzen, wie 7-Segment angeschlossen ist
if (SEGMENT & (1 << 0)) { PORTC |= 0b00001000; } //a an PC3
if (SEGMENT & (1 << 1)) { PORTC |= 0b00010000; } //b an PC4
if (SEGMENT & (1 << 2)) { PORTC |= 0b00000001; } //c an PC0
if (SEGMENT & (1 << 3)) { PORTC |= 0b00000010; } //d an PC1
if (SEGMENT & (1 << 4)) { PORTB |= 0b00000010; } //e an PB1
if (SEGMENT & (1 << 5)) { PORTC |= 0b00000100; } //f an PC2
if (SEGMENT & (1 << 6)) { PORTC |= 0b00100000; } //g an PC5
}
// LED blinken lassen
ISR(TIMER0_OVF_vect)
{
if (PINB & (1 << 0)) { PORTB |= 0b00000000; }
else { PORTB |= 0b00000001; }
}
int main(void)
{
DDRC = 0b00111111; // PC0 - PC5 als Ausgang
DDRB = 0b00000011; // PB0 - PB1 als Ausgang
Zahl = 0;
// Timer konfigurieren und GIE-Flag setzen
TCCR0 |= (1 << CS01); // Vorteiler 8
sei();
while(1)
{
// Auf dem 7-Segment Display die Zahlen 0 - 9 anzeigen
ZahlInSegment(Zahl);
Zahl++;
if (Zahl > 9) { Zahl = 0; }
_delay_ms (250);
}
}
Über Tipps wäre ich dankbar.
EDIT: Habe vergessen den Timer0 Interrupt freizuschalten. Jetzt klappts.
mfg
Benny
Lesezeichen