Stránka 1 z 2

Nefunguje korektně PWM na attiny2313

Napsal: 05 črc 2009, 18:44
od sqrka
Mám problém s nastavením pwm výstupu na OCR1A/B na attiny2313. Ať nastavím cokoliv, pokaždé to funguje špatně(občas to roztočí motorky v různých intervalech pak zase nic, škube to nehledě na ty nastavený sekundový intervaly atd.) nebo to nefunguje vůbec. Můj současný kód:
..
// Vystupni piny
bitSet (DDRB, 2);
bitSet (DDRB, 3);
bitSet (DDRB, 4);
bitSet (DDRD, 4);
bitSet (DDRD, 5);
bitSet (DDRD, 6);

OCR1A = 0;
OCR1B = 0;
// nastavi oc1a a oc1b fast 9bit pwm (az do cisla 511) viz. datasheet
TCCR1A = 0xA2;
TCCR1B = 0x09;



sei();

m_delay_s(1);
OCR1A = 350;
m_delay_s(1);
OCR1B = 350;
m_delay_s(1);
OCR1A = 0;
OCR1B = 0;
..

Podle datasheetu by to mělo fungovat. Před půl rokem jsem řešil asi stejný problém, nakonec ho tuším vyřešilo nastavení nějakých low nebo high fuse bitů. Problém je že už si vůbec nepamatuju jak přesně jsem to řešil. Zkusil jsem vypnout SPI, ale to jsem asi neměl dělat, protože už se na chip nedostanu. Možná jsem tím vypnul programování, ale chipů mám víc, takže to zatím nevadí. Co dělám špatně s tím pwm?

Napsal: 05 črc 2009, 18:57
od Andrea
Co to je za motůrky, jak to máš zapojené a na jaké frekvenci běží procesor? A ty dvě tečky je co, jak ten program pokračuje?

Napsal: 05 črc 2009, 20:01
od sqrka
Jsou to stejnosměrné motůrky, řídil jsem to přes 9-bit fast pwm už na atmega32, ale čip jsem nakonec využil tam, kde je opravdu potřeba, takže řídit se to dá. Attiny2313 běží na 20MHz, časování je perfektní, delay sedí(zkoušeno na ledkách), ale pokud nastavím TCCR1B = 0x09, tak to trvá asi minutu než se provede to co nemám ani naprogramováno. Pokud zakomentuju TCCR1B nebo nastavím na 1, tak motorky stejně dělají co chtějí ale zbytek kódu běží dále. Zapojené je to tak jak bylo i na tom atmega(přes mos-fet).

Napsal: 05 črc 2009, 20:11
od sqrka
test.c:

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <stdlib.h>
#include <string.h>

#define bitSet(var, mask) ((var) |= (1 << (mask)))
#define bitClear(var, mask) ((var) &= ~(1 << (mask)))

#define F_CPU 20000000UL // 20 MHz

#include <util/delay.h>
void m_delay_ms(unsigned int ms) {
unsigned int i;
for ( i=0; i<ms; i++) { _delay_ms(1); }
}
void m_delay_s(unsigned int s) {
unsigned int i, i2;
for ( i=0; i<s; i++) { for ( i2=0; i2<100; i2++) { _delay_ms(10); } }
}




int main () {

// Vstupni piny
bitClear (DDRB, 0);
bitClear (DDRB, 1);
bitClear (DDRD, 2);
bitClear (DDRD, 3);

// Vystupni piny
bitSet (DDRB, 2);
bitSet (DDRB, 3);
bitSet (DDRB, 4);
bitSet (DDRD, 4);
bitSet (DDRD, 5);
bitSet (DDRD, 6);

OCR1A = 0;
OCR1B = 0;
// nastavi oc1a a oc1b fast 9bit pwm (az do cisla 511) viz. datasheet
TCCR1A = 0xA2;
TCCR1B = 0x09;

sei();

m_delay_s(1);
OCR1A = 350;
m_delay_s(1);
OCR1B = 350;
m_delay_s(1);
OCR1A = 0;
OCR1B = 0;

m_delay_s(1);
bitSet (PORTB, 2);
bitSet (PORTD, 5);
m_delay_s(1);
bitClear (PORTB, 2);
bitClear (PORTD, 5);


while(1) {
m_delay_s(5);
}

}

Napsal: 05 črc 2009, 20:12
od Andrea
sqrka píše:ale pokud nastavím TCCR1B = 0x09, tak to trvá asi minutu než se provede to co nemám ani naprogramováno.

Jak se provede co nemáš naprogramováno, nešlo by se vyjadřovat trošku srozumitelněji. A co dělá ten zbytek programu, povoluješ tam přerušení, proč???

Napsal: 05 črc 2009, 21:24
od sqrka
To je celý program. Přerušení tam teprve plánuju dát, tak jsem ho rovnou povolil. Tudíš to divné chování motoru, respektive OCR1 pinů mi přijde docela zváštní, jakoby ten procesor snad něco resetovalo nebo přetekla paměť nebo co, prostě záhada. Samotné piny jsou ale v pohodě, zkoušel jsem je nastavit na log1 s nezaplým OCR a motorky se normálně rozeběhly na maximum, takže chybné zapojení nehrozí.

Napsal: 05 črc 2009, 21:28
od Andrea
Máš dobře zablokované napájení a na resetu kondík?

Napsal: 05 črc 2009, 21:42
od sqrka
Ne, programuju napřímo vodiči, které vedou rovnou or paralelního portu pc k pinům čipu. Když ale vyndám programovací kabel, tak se to chová stejně.

Napsal: 05 črc 2009, 22:05
od Andrea
sqrka píše:Ne, programuju napřímo vodiči, které vedou rovnou or paralelního portu pc k pinům čipu. Když ale vyndám programovací kabel, tak se to chová stejně.

Čehože, to byla odpověď na který dotaz?

Napsal: 05 črc 2009, 22:11
od sqrka
Na to jestli je tam kondenzátor na resetu. Není tam a říkám že na reset mám přímo připojený kabel z paralelního portu pc.

Napsal: 05 črc 2009, 22:15
od Andrea
sqrka píše:Na to jestli je tam kondenzátor na resetu. Není tam...

Tak ho tam dej, 10-100nF. A zablokované napájení(alespoň 100nF + 10uF) máš?

Napsal: 05 črc 2009, 22:56
od sqrka
Jak zablokované? Myslíš připojit mezi +5V a zem kondenzátor? Ten tam mám. Mám tam i stabilizátor, takže napětí je OK. Proč dát na reset kondenzátor? Mezi reset a zem? Na atmega nebyl vůbec potřeba.

Napsal: 05 črc 2009, 23:09
od Andrea
Když máš všechno tak v cajku, tak proč ti to nechodí, he?

Napsal: 05 črc 2009, 23:38
od sqrka
To bych rád věděl. Elektricky to v cajku asi mám, teď jsem si uvědomil, že když jsem nastavoval hfuse, tak jsem zbytek ostatních hodnot přepsal nulama místo defaultů tak proto mi to teď nejde programovat, myslím žo to vypnutí SPI mělo pomoct.

Napsal: 05 črc 2009, 23:55
od Andrea
sqrka píše:To bych rád věděl. Elektricky to v cajku asi mám, teď jsem si uvědomil, že když jsem nastavoval hfuse, tak jsem zbytek ostatních hodnot přepsal nulama místo defaultů tak proto mi to teď nejde programovat, myslím žo to vypnutí SPI mělo pomoct.

Nevím co do toho motáš SPI (ISP), které se sériově vypnout stejně nedá. Na ATmega32 jsi nejspíš zakazoval JTAG, protože ten je standardně zapnutý a zabírá 4 piny na portu C. Tina ale JTAG nemá. A nevím kde bereš tu jistotu, že máš napájení v pořádku, koukal jsi na něj osciloskopem?