Sida 1 av 1

gcc-avr och ATmega48

Postat: 24 juli 2005, 04:48:33
av speakman
Nu har jag äntligen fått snurr på 48:an. Iallafall programmeringsbiten.
Men problemet fortsätter;

För att göra det VÄLDIGT enkelt kör jag denna kod:

Kod: Markera allt

#define F_CPU 1000000UL // 1MHz

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/wdt.h>

int main(void)
{
        wdt_disable();

        DDRD = 0xFF;
        PORTD = 0xFF;

        while (1)
                wdt_reset();

        return 0;
}
Det som händer är att en lysdiod kopplad till en pinne på PORTD blinkar istället för att lysa!
Har jag glömt något?
Skulle någon vänlig själv vilja hjälpa mig med fuses H, L och E hur dom ska vara satt för att köra på den interna klockan, snabbast möjligt (8MHz?)
Har försökt bläddrat genom databladet lite snabbt, men som ni ser på tiden på detta inlägg så det nog dags att sova lite. :)
Men som sagt, vore skoj om man fick lite hjälp med fuses och eventuellt andra start-grejjer (första gången man kör AVR då!).

Mvh
speakman

Postat: 24 juli 2005, 06:24:49
av Icecap
När du nu börjar med att stänga av watchdog'en.....varför tusan resetter du den jämt?

Kod: Markera allt

#define F_CPU 1000000UL // 1MHz
#include <avr/io.h>
#include <avr/delay.h>

int main(void)
  {
  wdt_disable(); // Kan jag acceptera
  DDRD = 0xFF; // Tror jag på
  PORTD = 0xFF; // likaså här
  while(1); // Och sen stannar vi här i all evighet
  return 0; // Antar att denna är för att kompilern inte ska gnälla
  }
Jag har märkt att en del CPU har problem med att man resetter watchdog'en för ofta och en del slår på den om man råkar nollställa den så om du inte använder den ska du låta bli den helt och hållet!

Postat: 24 juli 2005, 09:13:24
av cykze
Ta bort båda anropen till wdt_*(), för du vill ju inte använda watchdogen.

Sätt L(ow byte) till 0xE2 för att inaktivera CKDIV8. Låt H(igh byte) och E(xtended fuse byte) ha kvar sina standardvärden!

Sedan kan du experimentera med _delay_ms() och lite toggling av bitarna i PORTD för att få något på PortD att blinka. Lägg det i while-loopen.

Glöm inte bort att läsa lite om begränsningarna med _delay_ms() i delay.h och ta en titt här för lite mer info om fördröjjningar.

Postat: 24 juli 2005, 12:38:20
av speakman
Jo, för att verkligen garantera att watchdogen inte resetade processorn. Därför stängde jag både av den (vilket bör stanna räknaren) och sedan resettade den för varje loop (vilket bör nolla räknaren).
Givetvis har jag kört utan dessa, men med samma resultat.

MEN! Jag tror jag kommit på det hela!
Jag hade nämligen plockat bort motståndet mellan utgången och lysdioden (kolla tiden på första inlägget, som sagt!), så nu när jag petade in ett vettigare motstånd än jag provade med första gången, så verkar det lira!
Tydligen resettas processorn om lasten blir för hög på utpinnarna! Smart.. :D

Nu ska jag fortsätta lite! Tack för tipset om fusen förresten! ;)

Mvh
speakman

Postat: 24 juli 2005, 14:33:49
av erixon
låter snarare som dålig avkoppling till μC och brown-out slog till....

Postat: 24 juli 2005, 16:46:43
av speakman
Vilken avkoppling syftade du på? PICar går ju faktiskt å köra en LED utan motstånd, även om det inte är att rekommendera.

Mvh
speakman

Postat: 24 juli 2005, 17:28:03
av Schnegelwerfer
Han menade dålig avkoppling till själva PICen.

Om du drar mycket ström på någon utgång, kan ju spänningsmatningen till PICen dippa och brown-out aktiveras.

Har du avkopplat spänningsmatningen till PICen med t.ex. en konding på 100nF?

Postat: 24 juli 2005, 18:55:20
av speakman
Japp, det har jag faktiskt. Även om det då var en ATmega48. :D

Mvh
speakman