ATmega48 sourcear max 5mA. Trasig?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

ATmega48 sourcear max 5mA. Trasig?

Inlägg av speakman »

Har gjort en liten enkel koppling med en ATmega48.
Bara för att komma igång med grunden kopplade jag in en LED i serie med ett 400ohms motstånd.
Upptäckte att den betedde konstigt, så jag skrev helt enkelt så LED:en tändes innan en evigshetsloop. Ingen annan kod förrutom att jag sätter PORTB till output.
Det visar sig att när lysdioden lyser mer än 0,5 sekunder så resetas AVR:en
Lade till wdt_disable(), men ingen förbättring...

Efter ett par timmas felsökande bytte jag ut seriemotståndet till ett 1kohm, och då resettar inte UC'n.

Efter en koll i databladet, så finner jag att den ska klara upp till 40mA per I/O-pinne. Och det enda som är inkopplat är en lysdiod med 12,5mA drivning.

Har ingen fler AVR hemma just nu så jag kan prova, men kan det verkligen vara något fel på den, eller är det något jag gör markant fel?

Har testat både drivit LED:en, och sourceat LED:en. Samma fenomen oavsett.

Mvh
speakman
Användarvisningsbild
PaNiC
Inlägg: 2610
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Kan det vara så att Atmel har lyckats producera en hel batch med Mega48 som är kassa? Jag har två här som också beter sig jävligt lustigt.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Typiskt min tur isf! :lol:

Mvh
speakman
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

Atmega48 har fuse bit för watchdog timmern....
"Possible Hardware fuse Watchdog always on (WDTON) for fail-safe mode"
står de i databladet på sidan 49 :) hoppas att det är till någon hjälp..
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Har provat exempelkoden strax under för att disabla WDT trots fusen, men det hjälper inte.
Borde verkligen watchdogen agera olika beroende på lasten på I/O-pinnarna?

Mvh
speakman
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Har nu provat exakt samma kod i en ATtiny2313 och det funkar kanon med ett 270 ohms seriemotstånd.
Mycket mysko med 48:an!

Mvh
speakman
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

ISP-pinnarna SCK, MISO och MOSI ligger på PORTB. Troligtvis har du satt någon av dessa till utgångar och har en programmerare utan tri-state-stöd inkopplad till dessa när du kör programmet. Kanske?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Njae, kör ju fyrmotståndsprogrammeraremodellen (PUST!). :)
Minns inte vilkan resistans det var (kan inte kolla nu), men tror det var 220ohm?
Borde det verkligen dra sån ström ändå?
Men jag är ganska säker på att jag även lyfte bort programmeraren vid felsökningen.
Men Tiny:n har jag programmeraren kvar på, och den funkar... :)
Vilken state har PORTB by default? Har ju som ingen kod som sätter något läge på dom...

Mvh
speakman
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

speakman skrev:Har provat exempelkoden strax under för att disabla WDT trots fusen, men det hjälper inte.
Borde verkligen watchdogen agera olika beroende på lasten på I/O-pinnarna?

Mvh
speakman
wdt_disable() funkar inte om man har fuse biten satt, testa istället att wdt_reset() i loopen....
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Jag uppfattade som att exempelkoden i databladet "overrides" (ursäkta) fuse-biten? Är du säker på att den inte gör det?

Mvh
speakman
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

speakman: Rör inte Watchdogen så rör inte den dig. Har du inte ändrat någon fusebit som gäller för Watchdogen eller aktivt aktiverat watchdogen i din kod så kan du helt strunta i den.

Jag kör tills vidare också med motståndsprogrammeraren och råkade någon gång sätta ISP-pinnarna höga vilket resulterade i att lysdioderna på PortB knappt lyste. Det blir en "krock" när utgångarna på AVR:en kopplas till utgångarna på parallellporten.

Alla portar är högohmiga ingångar som default. Sätt bitarna i DDRn (t ex DDRB) för att sätta motsvarande pinne som utgång. Ändra sedan i PORTn (t ex PORTB) för att växla mellan hög och låg för utgången.
Användarvisningsbild
exile
EF Sponsor
Inlägg: 496
Blev medlem: 21 oktober 2005, 23:32:07

Inlägg av exile »

speakman: Nä inte om man har fuse biten satt och det är vitsen med fuse biten vad än mjukvaran gör så kan den inte stänga av WDT utan endast resetar den...

Värt att notera är att den här funktion endast finns på nyare Atmegor som ex Atmega48...

Det behöver inte vara WDT som spökar men jag tycker att det är värt att testa...
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Ärligt talat kommer jag inte riktigt överens med avrdude än. Den är kasst dokumenterad, så jag har inte fått till att läsa/skriva fusen-bitarna än.
Ska se hur det är ställt när jag väl får till det. Ska testa vidare ikväll.

Mvh
speakman
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Lägg på växeln "-t" för att gå in i "interactive mode". Ex. "avrdude -c bsd -p m48 -t"

Sen kan du köra read hfuse för att läsa Fuse High byte. Sen write hfuse 0 0xdf för att skriva 0xDF till fusen. Lite krångligt.

Men har du inte ändrat några fuse-inställningar tidigare så ska du inte göra det nu heller, innan du har fått AVR:en att fungera som den ska.

Kan du posta din kod?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Tack cykze, det där var ett trevligt läge.
hfuse = 0xdf
Min kod är:

Kod: Markera allt

DDRB = 0xFF;
PORTB = 0x00;

for(;;) {
}
8)

Mvh
speakman
Skriv svar