AVR Studio problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

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
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

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
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

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.

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);
}
/Erik
Skriv svar