Gute Tag. Ich verwende einen Attiny2313 um die Helligkeit dreier LEDs zu steuern. Dazu benutze ich 3 PWM Kanäle. Nun bin ich auf ein Problem gestoßen, bei dem ich nicht weiter komme. Ich gehe davon aus, dass mein Programm in Ordnung ist, denn auf dem STK500 klappt alles ohne Probleme. Jeder Kanal lässt sich individuell einstellen. Das ganze habe ich jetzt auf Lochraster übertragen und ein Kanal macht Probleme. Habe ich alle drei Kanäle angeschlossen, so ist es immer der OC0B Pin (PD5) der nicht richtig funktionieren will. Ich habe ihn mal zur Seite gebogen, so dass er keine Kontakt mir dem Sockel hatte und mit eine Oszilloskop nachgemessen. Es tut sich nichts an dem Pin. Ich denke, dass dieser Pin dann die ganze Zeit hoch impedant ist. Gehe ich mit einem Schraubendreher dran so flackert die LED mit auffälligen 50Hz Das kuriose ist nun, dass dieser PWM Kanal an PD5 bestens funktioniert, sobald ich einen anderen PWM Kanal weg biege. Wenn ,in meinem Fall: OC0A oder OC1A, keinen Kontakt zum Sockel/Platine haben, funktionieren die zwei PWM Kanäle die übrig geblieben sind wunderbar. Ich habe schon alles mögliche nachgemessen. Die Eingänge der Mosfettreiber auf die die PWM Kanäle gehen haben alle keinen Kurzschluss. Die Treiber und die Mosfets funktionieren auch. Den Attiny habe ich testweise raus genommen und einen Arduino an die Pins angeschlossen. Alles funktionierte bestens, auf dem STK500 klappt auch alles ohne Probleme. Die Beschaltung des Attinys sieht wie folgt aus: 4MHz Quarz mit 22pF Stützkondensatoren. 100nF Abblockkondensator. Die Spannung beträgt 5V Die Beschaltung der Gatetreiber und der Mosfets: MCP1407 an 5V. 100nF Abblockkondensator. Die Beiden OUT Pins sind zusammengelötet und gehen auf das Gate des Mosfets (IRLU023N) Wo könnte mein Problem liegen?
Was passiert wenn du den Pin in Software als I/O auf (dauer-)high schaltest ?
Dextrose schrieb: > Die Beschaltung des Attinys sieht wie folgt aus: 4MHz Quarz mit 22pF > Stützkondensatoren. 100nF Abblockkondensator. Die Spannung beträgt 5V > Die Beschaltung der Gatetreiber und der Mosfets: MCP1407 an 5V. 100nF > Abblockkondensator. Die Beiden OUT Pins sind zusammengelötet und gehen > auf das Gate des Mosfets (IRLU023N) Schaltungen beschreibt man nicht in Prosa. Zeichne einen Schaltplan. mfg.
:
Bearbeitet durch User
Max D. schrieb: > Was passiert wenn du den Pin in Software als I/O auf (dauer-)high > schaltest ? Habe in der Hauptschleife: ,,sbi PORTD, 5" eingefügt. Wie zu erwarten bleibst der Pin die ganze zeit high. Habe einen anderen AVR ausprobiert und das selbe Problem. Hier ein Schaltplan, die anderen zwei Kanäle sind gleich aufgebaut. Die Übertragung via UART habe ich mit einem Logicanalyzer getestet. Die Daten kommen alle über.
"T1: Timer/Counter1 External Counter Clock input is enabled by setting (one) the bits CS02 and CS01 in the Timer/Counter1 Control Register (TCCR1)" Hast du evtl. da was gesetzt? Dextrose schrieb: > Ich gehe davon aus, dass mein Programm in Ordnung ist Dein Code wäre auch nützlich um das beurteilen zu können ;)
Wenn es denn dann sein muss, bitteschön:
1 | .def temp0 = r16 ; Definition eines Temporären Registers |
2 | .def temp1 = r19 |
3 | .def temp2 = r20 |
4 | .def temp3 = r21 |
5 | |
6 | .def data = r17 ; Data Register, beinhaltet das zu sendende Byte. |
7 | .def durchlauf = r18 |
8 | .def data_r = r10 |
9 | .def data_g = r11 |
10 | .def data_b = r12 |
11 | |
12 | |
13 | .equ baud = 9600 ; Definiere die baud Rate (HC-05, Standart = 9600 baud) |
14 | .equ f_cpu = 4000000 ; Definiere die Taktfrequenz des Controllers |
15 | |
16 | |
17 | .org 0x000 |
18 | rjmp main |
19 | |
20 | main: |
21 | ldi temp0, 0xff |
22 | out DDRB, temp0 |
23 | ldi temp0, (1<<PD5) |
24 | out DDRD, temp0 |
25 | |
26 | |
27 | sei |
28 | |
29 | ;////////////////////////////////////////////// Stack Pointer setzen ////////////////////////////////////////////////////////////////////// |
30 | ldi temp0, (RAMEND) ; Lade die niedrigen 8 Bit der letzten Adresse des Rams in temp0 |
31 | out SPL, temp0 ; Setze diese Adresse in die niedrigen 8 Bit des Stackpointers |
32 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | |
34 | |
35 | |
36 | ;//////////////////////////////////////////////// Timer0 & PWM //////////////////////////////////////////////////////////////////////////// |
37 | ldi temp0, (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00) ; COM0A1/B1 = 1 --> Die Pins OC0A/B sind nicht mehr vom PORT Abhängig. |
38 | ; Ebenfalls wird OC0A/B = 0 gesetzt wenn der Timer OCR0A/B erreicht. |
39 | ; Erreicht der Timer TOP (0xFF) dann wird OC0A/B = 1 gesetzt. |
40 | out TCCR0A, temp0 |
41 | |
42 | ldi temp0, (1<<CS00) ; Vorteiler des Timer setzen. |
43 | out TCCR0B, temp0 |
44 | |
45 | ldi temp0, 0x00 ; Setzen des Wertes ab wann OC0A = 0 sein soll. |
46 | out OCR0A, temp0 |
47 | ldi temp1, 0x00 |
48 | out OCR0B, temp1 ; Setzen des Werdes ab wann OC0B = 0 sein soll. |
49 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
50 | |
51 | |
52 | |
53 | ;//////////////////////////////////////////////// Timer1 & PWM //////////////////////////////////////////////////////////////////////////// |
54 | ldi temp0, (1<<COM1A1) | (1<<WGM10) ; Siehe Timer 0 |
55 | out TCCR1A, temp0 |
56 | |
57 | ldi temp0, (1<<CS10) |
58 | out TCCR1B, temp0 |
59 | |
60 | ldi temp0, 0x00 |
61 | |
62 | out OCR1AL, temp0 |
63 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
64 | |
65 | |
66 | |
67 | |
68 | ;////////////////////////////////////////////////// Baud Rate setzen ////////////////////////////////////////////////////////////////////// |
69 | .equ UBRRV = ((f_cpu)/(16*baud))-1 ; Errechne den Wert für das UBRR Regsiter (baud Register), Formel aus Datenblatt! |
70 | .equ baudR = (f_cpu/(16*UBRRV+1)) ; Errechne die Reelle baud Rate, Formel aus Datenblatt! ; |
71 | |
72 | ldi temp0, HIGH(UBRRV) ; Lade die 8 höheren Bits des errechneten Wertes ins UBRR Register (UBRRH) |
73 | out UBRRH, temp0 |
74 | ldi temp0, LOW(UBRRV) ; Lade die 8 niedrigen Bits des errechneten Wertes ins UBRR Register (UBRRL) |
75 | out UBRRL, temp0 |
76 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
77 | |
78 | |
79 | |
80 | |
81 | ;////////////////////////////////////////////// Frame Format setzen /////////////////////////////////////////////////////////////////////// |
82 | ldi temp0, (1<<UCSZ1) | (1<<UCSZ0) |
83 | ; UCSZ1 & UCSZ0 = 1, somit 8 Datenbits |
84 | out UCSRC, temp0 ; Ausgabe der Werte ins UCSRC REgister (HC-05 Standart) |
85 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
86 | |
87 | |
88 | |
89 | ;////////////////////////////////////////////// Reciver Aktivieren //////////////////////////////////////////////////////////////////////// |
90 | RX1: |
91 | ldi temp0, (0<<TXEN) | (1<<RXEN) ; Controller für's empfangen bereitstellen |
92 | out UCSRB, temp0 |
93 | rjmp empfang0 ; Anschließen ind die Empfang schleife springen |
94 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
95 | |
96 | |
97 | |
98 | ;/////////////////////////////////////////////////// Empfang Schleife ///////////////////////////////////////////////////////////////////// |
99 | empfang0: |
100 | ldi durchlauf, 0x09 ; Anzahl der Durchläufe |
101 | empfang1: |
102 | sbis UCSRA, RXC ; Revieve Complete (RXC) Flag prüfen |
103 | rjmp empfang1 |
104 | empfang2: ; Byte angekommen? Hier weitermachen! |
105 | in data, UDR ; RXC Flag Null: Lese die Daten aus UDR in "data" ein |
106 | push data ; Schiebe das Byte auf den RAM |
107 | dec durchlauf ; Reduziere die verbleibenden Durchläufe |
108 | cpi durchlauf, 0x00 ; Alle Bytes komplett? (=Anzahl der Durchläufe abgearbeitet) |
109 | brne empfang1 ; Wenn Durchläufe abgearbeitet weiter. Sonst zurück zu empfang1 und warte auf die nächsten Bytes |
110 | rjmp ausgabe ; Alle Durchläufe abgearbeitet --> zur Ausgabe |
111 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
112 | |
113 | |
114 | ;////////////////////////////////////////////////// Die Eingabe ausgeben ////////////////////////////////////////////////////////////////// |
115 | ausgabe: |
116 | |
117 | ;------------------------------------------------------ BLAU ------------------------------------------------------------------------------ |
118 | pop temp1 ;nn1 blau |
119 | ldi temp0, 0b00001111 |
120 | and temp1, temp0 |
121 | |
122 | |
123 | pop temp3 ;n1n |
124 | ldi temp0, 0b00001111 |
125 | and temp3, temp0 |
126 | mov temp2, temp3 |
127 | ldi temp0, 0x09 |
128 | bn1n_wtr0: |
129 | add temp2, temp3 |
130 | dec temp0 |
131 | cpi temp0, 0x00 |
132 | breq bn1n_wtr_ende |
133 | rjmp bn1n_wtr0 |
134 | bn1n_wtr_ende: |
135 | |
136 | |
137 | pop temp3 ;1nn |
138 | ldi temp0, 0b00001111 |
139 | and temp3, temp0 ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung |
140 | |
141 | cpi temp3, 0x00 ; Eine 0? |
142 | breq b1nn_wtr0 |
143 | cpi temp3, 0x01 ; Eine 1? |
144 | breq b1nn_wtr1 |
145 | cpi temp3, 0x02 ; Eine 2? |
146 | breq b1nn_wtr2 |
147 | |
148 | b1nn_wtr0: ; 0 --> 0 |
149 | ldi temp3, 0x00 |
150 | rjmp b1nn_wtr_end |
151 | b1nn_wtr1: ; 1 --> 100 |
152 | ldi temp3, 0x64 |
153 | rjmp b1nn_wtr_end |
154 | b1nn_wtr2: ; 2 --> 200 |
155 | ldi temp3, 0xC8 |
156 | rjmp b1nn_wtr_end |
157 | b1nn_wtr_end: |
158 | |
159 | add temp1, temp2 |
160 | add temp1, temp3 |
161 | mov data_b ,temp1 |
162 | ;---------------------------------------------------- GRÜN -------------------------------------------------------------------------------- |
163 | |
164 | pop temp1 ;nn1 grün |
165 | ldi temp0, 0b00001111 |
166 | and temp1, temp0 |
167 | |
168 | pop temp3 ;n1n |
169 | ldi temp0, 0b00001111 |
170 | and temp3, temp0 |
171 | mov temp2, temp3 |
172 | ldi temp0, 0x09 |
173 | gn1n_wtr0: |
174 | add temp2, temp3 |
175 | dec temp0 |
176 | cpi temp0, 0x00 |
177 | breq gn1n_wtr_ende |
178 | rjmp gn1n_wtr0 |
179 | gn1n_wtr_ende: |
180 | |
181 | pop temp3 ;1nn |
182 | ldi temp0, 0b00001111 |
183 | and temp3, temp0 ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung |
184 | |
185 | cpi temp3, 0x00 ; Eine 0? |
186 | breq g1nn_wtr0 |
187 | cpi temp3, 0x01 ; Eine 1? |
188 | breq g1nn_wtr1 |
189 | cpi temp3, 0x02 ; Eine 2? |
190 | breq g1nn_wtr2 |
191 | |
192 | g1nn_wtr0: ; 0 --> 0 |
193 | ldi temp3, 0x00 |
194 | rjmp g1nn_wtr_end |
195 | g1nn_wtr1: ; 1 --> 100 |
196 | ldi temp3, 0x64 |
197 | rjmp g1nn_wtr_end |
198 | g1nn_wtr2: ; 2 --> 200 |
199 | ldi temp3, 0xC8 |
200 | rjmp g1nn_wtr_end |
201 | g1nn_wtr_end: |
202 | |
203 | add temp1, temp2 |
204 | add temp1, temp3 |
205 | mov data_g ,temp1 |
206 | ;------------------------------------------------------- ROT ------------------------------------------------------------------------------ |
207 | |
208 | pop temp1 ;nn1 rot |
209 | ldi temp0, 0b00001111 |
210 | and temp1, temp0 |
211 | |
212 | pop temp3 ;n1n |
213 | ldi temp0, 0b00001111 |
214 | and temp3, temp0 |
215 | mov temp2, temp3 |
216 | ldi temp0, 0x09 |
217 | rn1n_wtr0: |
218 | add temp2, temp3 |
219 | dec temp0 |
220 | cpi temp0, 0x00 |
221 | breq rn1n_wtr_ende |
222 | rjmp rn1n_wtr0 |
223 | rn1n_wtr_ende: |
224 | |
225 | pop temp3 ;1nn |
226 | ldi temp0, 0b00001111 |
227 | and temp3, temp0 ; Ausmaskierung der oberren 4 Bits da UTF-8 Kodierung |
228 | |
229 | cpi temp3, 0x00 ; Eine 0? |
230 | breq r1nn_wtr0 |
231 | cpi temp3, 0x01 ; Eine 1? |
232 | breq r1nn_wtr1 |
233 | cpi temp3, 0x02 ; Eine 2? |
234 | breq r1nn_wtr2 |
235 | |
236 | r1nn_wtr0: ; 0 --> 0 |
237 | ldi temp3, 0x00 |
238 | rjmp r1nn_wtr_end |
239 | r1nn_wtr1: ; 1 --> 100 |
240 | ldi temp3, 0x64 |
241 | rjmp r1nn_wtr_end |
242 | r1nn_wtr2: ; 2 --> 200 |
243 | ldi temp3, 0xC8 |
244 | rjmp r1nn_wtr_end |
245 | r1nn_wtr_end: |
246 | |
247 | add temp1, temp2 |
248 | add temp1, temp3 |
249 | mov data_r ,temp1 |
250 | ;------------------------------------------------------------------------------------------------------------------------------------------ |
251 | |
252 | |
253 | out OCR0A, data_r |
254 | out OCR0B, data_g |
255 | out OCR1AL, data_b |
256 | |
257 | |
258 | rjmp empfang0 ; zurück zum empfang0 und auf Datenübertragung warten. |
259 | ;////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
So, habe nun das Problem lösen können. Wie es aussieht habe ich die Spannung am AVR nicht genug geglättet, bzw. teilweise Spannungsabfälle (brown outs?). Das hat den Controller aus dem Konzept gebracht. Nun habe ich genug Kondensatoren eingebaut, Elkos sowie Kerkos, und alles funktioniert super.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.