Mega8 som startar om hela tiden
Postat: 12 september 2010, 20:51:42
Tjo!
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.
Som en sidonot kan jag meddela att man blir lite tokig på att koppla ihop charlieplexingen rätt men det är ett annat problem =)
mvh
Anders
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