AVR - underligheter med reset och PWMutgångar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Argtomte
Inlägg: 243
Blev medlem: 7 april 2008, 22:49:49
Ort: Linköping
Kontakt:

AVR - underligheter med reset och PWMutgångar

Inlägg av Argtomte »

Jag håller på att pilla på ett roligt program till en RGB-powerLEDlampa. För lampstyrningen använder jag en ATmega168, där två av timerenheterna jobbar i Fast PWM läge och styr de tre LEDkanalerna. Jag har stött på lite problem i min kod. AVR:en verkar reseta konstant (jag lägger in ett färgprogram så att man tydligt ska se om något händer, men lampan stannar bara kvar på originalfärg). Så jag har nu bantat ned mitt program, tagit bort allt som inte verkar ha någon effekt på felet, och har till slut fått ned det till följande:

Kod: Markera allt

/**
 * Authors:
 *   Daniel Björklund (danbj266@student.liu.se)
 * Last updated: 2010-04-09
 * Version: 1.0
 * Description: 
 *
 * Control program for wall-mounted RGB lamp, remote controlled through IR
 *
 * µC 			: ATmega168
 * Clock rate 	: 8 MHz
 **/

#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdint.h>
#include <stdbool.h>
#include "rgb_cmd.h"

// Initial color
#define R_INIT 0
#define G_INIT 10
#define B_INIT 20

// PWM pulse length registers
#define R_PW OCR0A
#define G_PW OCR0B
#define B_PW OCR2A

// LED output pin locations
#define R_PIN 6 // PORT D
#define G_PIN 5 // PORT D
#define B_PIN 3 // PORT B

// IR input pin locations
#define IR_PINS PIND
#define IR_INPUT 2


void init();

void rgb(uint8_t r, uint8_t g, uint8_t b);


int main()
{
	init(); // Initialize timers, ports

	/* Enable interrupts */
	sei();

	for(;;) // Loop, interrupt handlers do all the work
	{
	
	}
}


void init() {
	/* PORT SETUP */
	DDRD = (1 << R_PIN) | (1 << G_PIN) | (0 << IR_INPUT);
	DDRB = (1 << B_PIN);

	/* VARIABLE SETUP */
	rgb(R_INIT, G_INIT, B_INIT);
	
	/* TIMER 0 SETUP */	
	// Red/Green PWM channels, 1/64 clock division
	TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0)|(0b10 << COM0B0);
	TCCR0B |= (0 << WGM02) | (0b011 << CS00);

	/* TIMER 1 SETUP */
	// 1/8 clock division, CTC mode, interrupt/top on tcnt 1000
	TCCR1B |= (0b11 << WGM12) | (0b010 << CS10);
	ICR1 = 1000;
	TIMSK1 |= (1 << ICIE1);

	/* TIMER 2 SETUP */
	// Blue PWM channel, functions like timer0
	TCCR2A |= (0b11 << WGM20)|(0b10 << COM2A0);
	TCCR2B |= (0 << WGM22) | (0b011 << CS20);
	
}


uint8_t cnt = 0;

ISR (TIMER1_CAPT_vect) {
	cnt = cnt + 1;
	rgb(cnt,cnt,cnt); // Cycle colors
}


void rgb(uint8_t r, uint8_t g, uint8_t b) {
	R_PW = r;
	G_PW = g;
	B_PW = b;
}
Det intressanta här är raden

TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0)|(0b10 << COM0B0);

I slutet av denna sätter jag att båda utgångarna OC0A och OC0B ska vara kopplade till timern med PWMfunktion. Jag har lyckats isolera felet till den här raden, om än på ett något underligt sätt. Om jag kommenterar enligt någon av följande varianter så funkar programmet som det ska (förutom att en färgkanal saknas förstås):

Kod: Markera allt

TCCR0A |= (0b11 << WGM00)|(0b10 << COM0A0);

eller

TCCR0A |= (0b11 << WGM00)|(0b10 << COM0B0);
Med andra ord, om jag bara väljer en av utgångarna så funkar programmet och färgloopandet kör igång (och det spelar ingen roll vilken av OC0A/B jag väljer att koppla in), men om båda är valda så står programmet kvar på startfärgen, och jag tycker det verkar vara symptomatiskt för ett konstant reset:ande (även om jag inte vet hur man testar den hypotesen).

Några förslag på vad som kan vara fel?

Utgångarna OC0A/B är kopplade enbart till ett par transistorer, genom ett 1kohms basmotstånd (som sedan driver LEDkanalerna tillsammans med strömbegrmotstånd).

Tack på förhand!

EDIT: Hoppsan. Råkade posta i Allmänt istället för Mikroprocessorforumet, ni får ursäkta. :? Så går det när man har för många EF-fönster öppna! Moderator får gärna flytta.
Användarvisningsbild
Swech
EF Sponsor
Inlägg: 4750
Blev medlem: 6 november 2006, 21:43:35
Ort: Munkedal, Sverige (Sweden)
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av Swech »

Hur är det med sparande av statusregister mm vid interrupt i C.
Fixar kompilatorn detta?

Swech
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av jesse »

Om det är AVR-GCC så ska man inte behöva oroa sig för det. Har du kollat eventuella kortslutningar t.ex. mellan utgångar och jord/vcc? Om en kortsluten utgång plötsligt ändrar nivå kan det dra ner hela vcc så att processorn resetar. (t.ex den färg som du kommenterar bort när programmet fungerar)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av sodjan »

Hur är det med alla standard saker ?
Koppligen av reset-pinnen. Inga öppna ingångar. O.s.v
Användarvisningsbild
calmar
Inlägg: 540
Blev medlem: 23 november 2005, 13:14:41
Ort: Göteborg
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av calmar »

Avkopplingskondingar på spänningsmatningen?
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av labmaster »

Mitt tipps är att kolla watchdog timern så att det inte är den som resetar CPU:n. Eventuellt är den på by default men jag kan ha blandat ihop detta med CC1010 från chipcon.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av jesse »

Kan du förklara (gärna med hänvisning till stycken i databladet) hur du tänkt dig att timer0 ska fungera?
Vilket mode, och vad som ska hända för de båda värdena COM0A0 och COM0B0 ?

EDIT:
Lite tidsödande att försöka läsa databladet "baklänges" via din kod, men jag har gjort ett försök:

Du ska köra "Fast PWM mode" (WGM00 = 11) .

COM0A0 = 10 betyder "Clear OC0A on Compare Match, set OC0A at BOTTOM"
COM0B0 = 10 betyder "Clear OC0B on Compare Match, set OC0B at BOTTOM"

Är du verkligen säker på att processorn "resettar" eller tror du bara det för att färgerna inte ändras? Skriv en enkel rutin som blinkar tre gånger vid reset innan programmet startar. Då ser du om det verkligen blir reset.
Användarvisningsbild
Argtomte
Inlägg: 243
Blev medlem: 7 april 2008, 22:49:49
Ort: Linköping
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av Argtomte »

Tack för svaren!
  • Jag kör AVR-GCC, så jag har också uppfattat det som att man inte ska behöva bry sig om undansparande vid interrupts
  • Prylen är spänningsmatad från mitt spänningsagg med 5V, och har en avkopplingselektrolyt på runt 1 µF
  • Reset har 33k-pullup till +5V. Jag har inte kopplat in alla ingångar, det var en vettig synpunkt, ska komma ihåg att testa att koppla in pullup internt på allihop som jag inte använder när jag kommer hem från plugget och se om det blir bättre
  • Jag tänkte också på watchdog, så jag kollade den särskilt på fuse calculator och programmerade om prylen, men ingen skillnad
jesse:

Tanken är att OC0A ska styra en färg, och OC0B en annan färg. COM0A/B sätter hur dessa utgångar är inkopplade. 0b00 ger att de är helt vanliga I/O-pinnar (vilket de är per default vid reset) och alltså inte inkopplade till timern. 0b10 som jag sätter ger att de är styrda direkt av timern och sätts höga då timern är vid 0, sätts till låga då timern ger compare match (vilket sker beroende på inställd pulslängd för de olika färgerna, som ligger i registren OCR0A/B).

Situationen är alltså att om bara en färgutgång styrs av timern, och den andra är satt som vanlig I/O så fungerar min krets. Om båda är timerstyrda samtidigt så händer ingenting. Notera att båda färgerna funkar var för sig.

Mitt program är skrivet så att utfärgen rampar upp från RGB=0,0,0 till RGB=255,255,255. Jag ser rampningen i färgerna var för sig när bara en av dem är inkopplad, så det borde innebära att en kortslutning inte är svaret då båda färger kan visas (eller i alla fall inte på just det sättet, kan mycket väl var någon slags kortis som spökar.) När båda färgpins är timerstyrda så händer ingenting, ingen rampning sker alls, den står kvar på startvärde RGB=0,0,0.
Användarvisningsbild
dunz
Inlägg: 94
Blev medlem: 23 januari 2011, 02:13:43
Ort: Enköping
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av dunz »

Hur driver du dioderna då? Det är inte säkert att din Atmega orkar mata ut tillräckligt med ström för att driva alla tre kanaler om du har många dioder.
Användarvisningsbild
Argtomte
Inlägg: 243
Blev medlem: 7 april 2008, 22:49:49
Ort: Linköping
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av Argtomte »

Varje LED-kanal drivs med en NPNtransistor, där AVR-pinnarna går till bas genom 1k-basmotstånd. IOpinnarna behöve nog inte driva mer än nån mA så det borde inte vara ett problem. Jag kan ta lite kort på konstruktionen när jag kommer hem så syns det tydligare. Jag kan ta och sätta ihop ett schema för det jag byggt också (har inget just nu, byggde på veroboard).
Senast redigerad av Argtomte 23 maj 2011, 13:11:41, redigerad totalt 1 gång.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av thepirateboy »

Har du satt data direction register för OC0A och OC0B (det måste du göra)?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av jesse »

Kod: Markera allt

   /* PORT SETUP */
   DDRD = (1 << R_PIN) | (1 << G_PIN) | (0 << IR_INPUT);
   DDRB = (1 << B_PIN);
Går det att blinka med alla dioderna (i olika kombinationer) genom att ställa utgångarna på vanligt vis, dvs. utan timern?
Användarvisningsbild
Argtomte
Inlägg: 243
Blev medlem: 7 april 2008, 22:49:49
Ort: Linköping
Kontakt:

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av Argtomte »

Att köra kanalerna manuellt låter som vettig felsökningsmetod! Jag ska testa det under kvällen och återkomma. Tack för tipsen!
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av bearing »

avkopplingselektrolyt
Inte alls lämplig som avkopplingskondensator. Jag har nog aldrig läst ordet avkopplingselektrolyt i sammanhanget digitalelektronik. Kollade snabbt på Elfa, och där framgick det att en standard elektrolytkondensator 50V 1uF har ESR på över 100 ohm! Dessutom har den nog en betydande ESL också.

Keramisk 100nF som brukar användas som avkopplingskondensator gissar jag har mindre än 0,1 ohm ESR, och obetydlig ESL.
labmaster
Inlägg: 2919
Blev medlem: 5 april 2011, 01:10:25

Re: AVR - underligheter med reset och PWMutgångar

Inlägg av labmaster »

Ytterligare en möjlighet är att koppla bort lysdioderna från portarna och koppla in ett oscilloskop för att se utsignalerna. Då vet du att portarna fungerar och att de inte blir för högt belastade.
Skriv svar