Sorry för det sista "gnöliga" inlägget. Jag var kanske lite trött just då.
Ngn som vet en/flera bra lathundar/guider över hur man programmerar timers, interrupts och I/O i GCC.
/Erik
AVR Studio problem
-
- Inlägg: 53
- Blev medlem: 12 februari 2007, 20:10:39
- Ort: Frostkåge
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
Du kan kolla på cykzes program http://www.elektronikforumet.com/forum/ ... php?t=8744
I imagecraft finns också ett hjälpprogram som genererar kod
http://www.imagecraft.com/
Ännu ett program (buggigt)
http://www.avrfreaks.net/index.php?modu ... pe=project
I imagecraft finns också ett hjälpprogram som genererar kod
http://www.imagecraft.com/
Ännu ett program (buggigt)
http://www.avrfreaks.net/index.php?modu ... pe=project
-
- Inlägg: 53
- Blev medlem: 12 februari 2007, 20:10:39
- Ort: Frostkåge
Kan ngn se vad jag missat i följande kod som är en kombination av två olika demo program som följde med GCC.
Jag antar att baudraten inte blir rätt eftersom det bara kommer skräp eller ingenting i hyperterminalens fönster. Fast det kom det riktig text en gång.
/Erik
Jag antar att baudraten inte blir rätt eftersom det bara kommer skräp eller ingenting i hyperterminalens fönster. Fast det kom det riktig text en gång.
Kod: Markera allt
#include "defines.h"
#include <ctype.h>
#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include "iocompat.h" /* Note [1] */
#include "uart.h" /* Note [1] */
enum { UP, DOWN };
uint16_t num=0;
uint32_t sec=0;
ISR (TIMER1_OVF_vect) /* Note [2] */
{
static uint16_t pwm; /* Note [3] */
static uint8_t direction;
switch (direction) /* Note [4] */
{
case UP:
if (++pwm == TIMER1_TOP)
{
direction = DOWN;
num++;
}
break;
case DOWN:
if (--pwm == 0)
{
num++;
direction = UP;
}
break;
}
num++;
if (num == 1800)
{
num=0;
sec++;
}
OCR = pwm; /* Note [5] */
}
void
ioinit (void) /* Note [6] */
{
/* Timer 1 is 10-bit PWM (8-bit PWM on some ATtinys). */
TCCR1A = TIMER1_PWM_INIT;
/*
* Start timer 1.
*
* NB: TCCR1A and TCCR1B could actually be the same register, so
* take care to not clobber it.
*/
TCCR1B |= TIMER1_CLOCKSOURCE;
/*
* Run any device-dependent timer 1 setup hook if present.
*/
#if defined(TIMER1_SETUP_HOOK)
TIMER1_SETUP_HOOK();
#endif
/* Set PWM value to 0. */
OCR = 0;
/* Enable OC1 as output. */
DDROC = _BV (OC1);
/* Enable timer 1 overflow interrupt. */
TIMSK = _BV (TOIE1);
sei ();
}
FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
int
main (void)
{
uint32_t last;
uart_init();
stdout = stdin = &uart_str;
ioinit ();
DDRB = 0xFF;
PORTB = 4;
/* loop forever, the interrupts are doing the rest */
for (;;) /* Note [7] */
{
if (last != sec)
{
printf("Test av detta ");
int h, m, s;
h = sec % 3600;
s = sec - h * 3600;
m = s % 60;
s = s - m * 60;
printf("%02d:%02d:%02d\n", h, m, s);
PORTB = ~sec;
}
last = sec;
_delay_ms(10);
}
return (0);
}