Witam,
na wstępie poszukiwania Google nic nie dały...
Jaki mam problem - sterowanie jasnością dwóch żarówek (niezależnie) poprzez opto i triak z TIMER1 (OCRA/OCRB) Atmega.
Programuję w Assemblerze.
Wykonałem to jako fastPWM dla TIMER1 z wartością TOP w ICR1 i wartościami dla jasności w OCRA i B. Wykrywanie narastających i opadających oblicza czas połówki -> wpis do ICR, a następnie synchronizacja tak, aby zliczanie kończyło się przed opadającym. Działa, jednak widoczne jest delikatne migotanie żarówek -zmiany jasności.
Postanowiłem zrobić to inaczej i prościej. I mam problem.
Robię to tak - ustawiam TMER1 z prescalerem clk/8 (mam 16MHz /8), co dla połówki daje mi około 20 tys. zliczeń - skala regulacji jasności.
Wykrywam zbocze narastające połówki (sinusoida przepuszczona przez Graetza) i
;_|^^ teraz zbocze narastające (w sensie przewodzenia transoptora detektora 50Hz) bo teraz jest =0 czyli Aktywny;
;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
;-wpis 0000 do licznika TCNT ;
;-wpis wartości dla A i B ;
;-podłącz piny A i B
lds zl,TCNT1l ;\odczyt licznika
lds zh,TCNT1h ;/
sts DsfPWM_WartoscTCNT1normalAcUP,zl ;\
sts DsfPWM_WartoscTCNT1normalAcUP+1,zh ;/
ldi zh,0x00 ;\
ldi zl,0x00 ;\licznik =0000 wyzerujemy, aby startowal od początku
sts tcnt1h,zh ;/ potrzebne, bo jeśli by wielka wartość to dłużej trwa synchronizacja
sts tcnt1l,zl ;/ chyba że jest zerowany po RESET i nie potrzeba w innym momencie resetować synchronizacji
lds zl,DsfPWM_TMPdla_AiB ;
lds zh,DsfPWM_TMPdla_AiB+1 ;
sts OCR1Ah,zh ;\
sts OCR1Al,zl ; \to wyeliminuje bum przy pierwszym
sts OCR1Bh,zh ; /zapaleniu
sts OCR1Bl,zl ;/
;TCCR1A = COM1A1=0,COM1A0=0,COM1B1=0,COM1B0=0,0,0,WGM11=0,WGM10=0 ;WGM=&0=NORMAL
ldi r16,(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\podłączenie PINów
sts tccr1A,r16 ; /
zaś przed zakończeniem połówki
;^^|_ teraz zbocze opadajęce bo teraz jest =1 czyli Nieaktywny;
;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
;- odłącz piny A i B od TIMERa ;
;- wpisz wielkie wartości dla A i B ;
;- dla bezpieczeństwa -zeruj piny 'ręcznie' ;
ldi r16,0;(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\odłączenie PINów
sts tccr1A,r16 ; /
in r16,EtfPWM_PORTsterowaniaLIGHT ;
andi r16,~((1<<EtfPWM_bitOC1A_NS)|(1<<EtfPWM_bitOC1B_EW)) ;zeruj -odłączone już PINy A i B
out EtfPWM_PORTsterowaniaLIGHT,r16 ;
i kicha.
Wkład zachowuje się tak
po załączeniu lampy wygaszone.
Po wpisaniu wartości do "DsfPWM_TMPdla_AiB" mniejszej niż górna granica zapala lampy i świecą ciągle. Wpisanie innych wartości -powyżej granicy nie powoduje już zmian. Lampy świecą do końca świata...
Pytanie - jak ręcznie skasować wystąpienie zdarzeń A i B? Jakimiś bitami?
Proszę o litość i pozytywną energię w odpowiedzi.
Pozdrawiam, WikS
Dodano po 50 [minuty]
Czyli właściwie nie wiem, jak skasować wartości bitów OCRA1 i OCRB1 po zboczu opadającym, bo ponowne podłączenie po zboczu narastającym wykazuje, że wartość =1 jest tam nadal (odłączenie po opadającym było)...
Narastająca wartość licznika TCNT w momencie zrównania z OCRA/B powoduje generację 1 n wyjściu. Jak ją wyzerować?
Dodano po 3 [godziny] 13 [minuty]:
[...] ufff
rozwiązałem problem.
Przy przerwaniu opadającym zapisuję do liczników OCA i B wartośc odczytana z TCNT +np. 5 i równocześnie ustawiam bity da OCA i B wywołujace ich skasowanie przy zrównaniu. Działa!
na wstępie poszukiwania Google nic nie dały...
Jaki mam problem - sterowanie jasnością dwóch żarówek (niezależnie) poprzez opto i triak z TIMER1 (OCRA/OCRB) Atmega.
Programuję w Assemblerze.
Wykonałem to jako fastPWM dla TIMER1 z wartością TOP w ICR1 i wartościami dla jasności w OCRA i B. Wykrywanie narastających i opadających oblicza czas połówki -> wpis do ICR, a następnie synchronizacja tak, aby zliczanie kończyło się przed opadającym. Działa, jednak widoczne jest delikatne migotanie żarówek -zmiany jasności.
Postanowiłem zrobić to inaczej i prościej. I mam problem.
Robię to tak - ustawiam TMER1 z prescalerem clk/8 (mam 16MHz /8), co dla połówki daje mi około 20 tys. zliczeń - skala regulacji jasności.
Wykrywam zbocze narastające połówki (sinusoida przepuszczona przez Graetza) i
;_|^^ teraz zbocze narastające (w sensie przewodzenia transoptora detektora 50Hz) bo teraz jest =0 czyli Aktywny;
;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
;-wpis 0000 do licznika TCNT ;
;-wpis wartości dla A i B ;
;-podłącz piny A i B
lds zl,TCNT1l ;\odczyt licznika
lds zh,TCNT1h ;/
sts DsfPWM_WartoscTCNT1normalAcUP,zl ;\
sts DsfPWM_WartoscTCNT1normalAcUP+1,zh ;/
ldi zh,0x00 ;\
ldi zl,0x00 ;\licznik =0000 wyzerujemy, aby startowal od początku
sts tcnt1h,zh ;/ potrzebne, bo jeśli by wielka wartość to dłużej trwa synchronizacja
sts tcnt1l,zl ;/ chyba że jest zerowany po RESET i nie potrzeba w innym momencie resetować synchronizacji
lds zl,DsfPWM_TMPdla_AiB ;
lds zh,DsfPWM_TMPdla_AiB+1 ;
sts OCR1Ah,zh ;\
sts OCR1Al,zl ; \to wyeliminuje bum przy pierwszym
sts OCR1Bh,zh ; /zapaleniu
sts OCR1Bl,zl ;/
;TCCR1A = COM1A1=0,COM1A0=0,COM1B1=0,COM1B0=0,0,0,WGM11=0,WGM10=0 ;WGM=&0=NORMAL
ldi r16,(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\podłączenie PINów
sts tccr1A,r16 ; /
zaś przed zakończeniem połówki
;^^|_ teraz zbocze opadajęce bo teraz jest =1 czyli Nieaktywny;
;- zapamiętaj wartość licznika TCNT (dla późniejszych skalowań i pomiaru częstotliwości)
;- odłącz piny A i B od TIMERa ;
;- wpisz wielkie wartości dla A i B ;
;- dla bezpieczeństwa -zeruj piny 'ręcznie' ;
ldi r16,0;(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0) ;\odłączenie PINów
sts tccr1A,r16 ; /
in r16,EtfPWM_PORTsterowaniaLIGHT ;
andi r16,~((1<<EtfPWM_bitOC1A_NS)|(1<<EtfPWM_bitOC1B_EW)) ;zeruj -odłączone już PINy A i B
out EtfPWM_PORTsterowaniaLIGHT,r16 ;
i kicha.
Wkład zachowuje się tak
po załączeniu lampy wygaszone.
Po wpisaniu wartości do "DsfPWM_TMPdla_AiB" mniejszej niż górna granica zapala lampy i świecą ciągle. Wpisanie innych wartości -powyżej granicy nie powoduje już zmian. Lampy świecą do końca świata...
Pytanie - jak ręcznie skasować wystąpienie zdarzeń A i B? Jakimiś bitami?
Proszę o litość i pozytywną energię w odpowiedzi.
Pozdrawiam, WikS
Dodano po 50 [minuty]
Czyli właściwie nie wiem, jak skasować wartości bitów OCRA1 i OCRB1 po zboczu opadającym, bo ponowne podłączenie po zboczu narastającym wykazuje, że wartość =1 jest tam nadal (odłączenie po opadającym było)...
Narastająca wartość licznika TCNT w momencie zrównania z OCRA/B powoduje generację 1 n wyjściu. Jak ją wyzerować?
Dodano po 3 [godziny] 13 [minuty]:
[...] ufff
rozwiązałem problem.
Przy przerwaniu opadającym zapisuję do liczników OCA i B wartośc odczytana z TCNT +np. 5 i równocześnie ustawiam bity da OCA i B wywołujace ich skasowanie przy zrównaniu. Działa!