Sitter o pillar lite med en atmega8 men den envisas med att starta om hela tiden.
Projektet är en klocka. Använder interna klockan. 4-st sjusegments displayer som är charlie plexade för att visa tiden.
Timer1 ska användas för att räkna sekunder
Timer2 används för att updatera displayen.
Schema.
http://dl.dropbox.com/u/213189/charlie.pdf
Änsålänge drivs hela klockan av programmeraren, stk500v2.
Allting är ihoplött på en bit experimentkort.
Problemen då? Som det står i rubriken så verkar jag så startar megan om hela tiden. Har jag missat något i koden(finns nedan)? Jag har läst som attans i databladet om timers men kan inte se något. Bör jag koppla matningen o reset annorlunda? Eller gör jag något helt annat fel?
Kod.
Kod: Markera allt
/*
* main.c
*
* Created on: Mar 28, 2010
* Author: anders
*/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/* _ 2
* | | 1 3
* _ 0
*
* | | 4 6
* _ 5
*/
uint8_t seconds=55;
uint8_t onemin=9;
uint8_t tenmin=59;
uint8_t onehour=9;
uint8_t tenhour=1;
uint8_t numbers[] = { 0x7E, 0x48, 0x3D, 0x6D, 0x4B, 0x67, 0x77, 0x4C, 0x7F,
0x4F, 0x5F, 0x73, 0x36, 0x79, 0x37, 0x17 };
int main() {
// För att se att den resetar på ocilloskop
DDRD=0x20;
PORTD=0x20;
_delay_us(200);
PORTD=0x00;
DDRD=0x00;
// timer 2 används för displayen
TIMSK |= 1 << OCIE2; //interrupt enable
TCCR2 |= (1 << CS01) | (1 << CS00); // prescale 64 timer0
OCR2 = 40; //TODO stäm av detta senare vilken frekvens som blir bra
// timer 1 används för sekund tick
TCCR1B |= (1 << WGM12); // CTC mode
TIMSK |= (1 << OCIE1A); // CTC interrupt
TCCR1B |= ((1 << CS10) | (1 << CS11)); // Fcpu/64
OCR1A = 15624; // 15624 ger 1Hz at 1MHz prescaler 64
// Enable global interrupts
sei();
while (1) {}
}
ISR(TIMER1_COMPA_vect)
{ //Sekunderna på enminutsdisplayen
DDRD=0x80 | numbers[seconds];
PORTD= numbers[seconds];
DDRC= numbers[seconds];
PORTC= numbers[seconds];
seconds++;
/*
if (seconds >= 60) {
seconds = 0;
onemin++;
}
if (onemin >= 10) {
onemin = 0;
tenmin++;
}
if (tenmin >= 6) {
tenmin = 0;
onehour++;
}
if (onehour >= 10) {
onehour = 0;
tenhour++;
}
if (tenhour >= 2 && onehour >= 4) {
tenhour = 0;
onehour = 0;
}*/
}
ISR(TIMER2_COMP_vect)
{
TCNT2=0; // Reset timer to 0
// Display
static uint8_t disp=0;
disp++;
// Används ej än så länge
/* switch (0) {
case 0:
DDRD = 0x8F;
PORTC = 0x0F;
PORTD = 0x40;
disp++; //TODO increase
PORTD=0x02;
break;
case 1:
DDRD = 0x02;
PORTC = (numbers[tenmin] << 2) | (numbers[tenmin] >> 6);
disp++;
break;
case 2:
DDRC = 0x04;
PORTC = (numbers[onehour] << 3) | (numbers[onehour] >> 5);
disp++;
break;
case 3:
DDRC = 0x08;
PORTC = (numbers[tenhour] << 4) | (numbers[tenhour] >> 4);
disp = 0;
break;
}
*/
}
mvh
Anders