Sida 1 av 1
Mycket underligt problem med en ATMega128
Postat: 11 april 2006, 10:09:08
av strombom
Jag har gjort ett väldigt kort program:
Kod: Markera allt
#include <avr/io.h>
void pausenn(void);
int main(void)
{
//Kort rutin som vägrar avslutas...
pausenn();
//Endast för att generera fyrkantsvåg till oscilloskopet så jag kan se att något händer:
DDRD |= (1<<4);
while(1) {
PORTD |= (1<<4);
PORTD &= ~(1<<4);
}
return 0;
}
void pausenn(void) {
char i;
for(i=0;i<66;i++);
}
Mitt problem är att om jag sätter ett större tal än 66 i den understa loopen så hänger sig programmet där och går inte vidare... om jag har 66 eller lägre så fortsätter programmet glatt.
Jag blir helt snurrig på detta. HJÄLP
Postat: 11 april 2006, 10:49:24
av Kaggen
Du är säker på att problemet inträffar när i är större än 66 och inte 127? I annat fall skulle du kunna deklarera i som en "unsigned char" istället eftersom 128 i en "char" är detsamma som -127 iomed att den är signed.
Men du kanske redan vet detta och redan testat det.
Du har inte något interrupt igång? Jag vet inte riktigt hur det är på AVR men du borde väl ha någon global interrupt-flagga. Prova disablea den i koden, utifall...
Annars är ju det hela mysko.
Postat: 11 april 2006, 11:02:00
av björn
Du gör endast paus innan du gå rin i loopen, borde du inte ha pausen i loopen? jag tror att du inte hinner se att den togglar bara.
Eller hur har du tänkt? jag kanske har missat hur du använder det...
EDIT: Nej det bör inte bero på det, du kollar ju på det i ociloscopet, då kan inte jag se något fel :(
Postat: 11 april 2006, 12:16:50
av sodjan
Har processorn watchdog ?
Och i så fall, är den på ?
Postat: 11 april 2006, 12:42:45
av JJ
Hur ser den disassemblerade koden ut? Hur funkar det i studion?
Postat: 11 april 2006, 12:49:37
av cykze
Inte för att det borde har någon betydelse i det här fallet men prova att lägga in nyckelordet "volatile" innan "char i;". Asm-koden för båda fallen (under 66 och över 66) skulle, som JJ skrev, vara kul att se på.
Postat: 11 april 2006, 12:54:36
av simon78
precis som cytze sa; prova med volatile. Det är risk att kompilatorn optimerar bort "tomma uttrycket" och inte kör for-satsen alls annars.
Postat: 11 april 2006, 12:55:43
av MicaelKarlsson
Varför inte bara starta PWM-en?
Postat: 11 april 2006, 13:02:47
av exile
Jag har kört din kode och den fungerar med värden störe än 66...
Villken verson av gcc har du?
Postat: 11 april 2006, 14:08:23
av AndXy
Har du testat att deklarera variabeln i som en "integer" istället för "character" ?
Postat: 12 april 2006, 21:30:23
av strombom
Oj oj, jag såg inte att det kommit svar
Jag har aldrig använt atmega128 innan. Den har en kompabilitets-"fuse" för någon krets som heter 103. När jag stängde av den så fungerade allt perfekt...
Jag gick till och med så långt att jag lödde bort kretsen och testade med en ny. Den överlevde dock värmepistolen, ingen skada skedd. Slösade bara bort 4 timmar på felsökning.
/Johan
Edit: Avrlib är ju underbart, det tog mig 10 minuter att få en grafisk LCD att rita en cirkel. Efter 30 minuter till hade jag en animation med bilder ritade i paint. Om någon ska till Custom Motor Show på Elmia kan ni se den där.

Postat: 12 april 2006, 21:40:47
av björn
Vad skall displayen användas till? och var hittar man dig på elmia om man åker dit?
Postat: 12 april 2006, 21:54:12
av strombom
Den sitter på en ratt som jag nämnt i en annan tråd (
http://www.elektronikforumet.com/forum/ ... 73&start=0 ).
Ratten skall i sin tur sitta i en formula-bil som jag är med och bygger:
http://www.me.chalmers.se/formula/2006/html/index.php
Mig träffar du om du går dit på måndag (sista dagen), var vår monter är har jag inte ens kollat upp, jag avsade mig allt ansvar för planeringen (hade tillräckligt mycket att göra)
Vår bil är dock inte klar så vi har med en bil från tidigare år, vi visar bara smådelar från vår kommande bil.
Postat: 13 april 2006, 12:39:51
av MicaelKarlsson
strombom skrev:
Jag har aldrig använt atmega128 innan. Den har en kompabilitets-"fuse" för någon krets som heter 103. När jag stängde av den så fungerade allt perfekt...
Det felet har man ju inte gjort...
Glöm inte att kolla upp ITAG-en om du skall fippla med port F!!