Hallo, ich habe heute meine Schaltung für meinen LED Cube fertig gebaut und binn auf ein paar Probleme gestoßen. 1. Ist 2,8 A zu viel für den µC ? (5V) 2. Ich habe ein Programm aus einem Forum drauf gespielt, seite dem kann ich ihn leider nicht mehr neu Programmieren da er den gesamten Strom vom Progger zieht (SMD LED auf dem Progger erlischt) 3. Mein µC wird heiß , kann das an 1. liegen ? Leider habe ich die Vermutung das ich den µC gehimmelt habe. Werde mir wohl mal ein anderes Programm raussuchen , vorallem eins für 16MHz Crystal.
Hallo Lars Schön, das du eine Heizung gebaut hast. Wird ja jetzt bald Winter und da ist es ja nicht so verkehrt, etwas gegen die Kälte zu haben. Ein Elektroniker würde ja jetzt anfangen, nachzuschauen, wo der Strom entsteht und vielleicht mithilfe von Skizzen die Wege ergründen. Daher vermute ich mal, das du mal grade weißt, das Ampere das Maß für elektrischen Strom ist. Nun ja, das ist ja schon mal etwas. Kommen wir zum eigentlichen Kern deines Problems. Um eines mal klarzustellen, nur mit einem Programm bekommst du den Rauch aus dem Chip nicht raus. Also davon wird ihm nicht warm und schon gar nicht heiß. Also liegt es an deiner Hardware. Vielleicht hast du ja die Vorwiderstände vor den LED's weggelassen oder Hochstrom-LED's benutzt und keine Treiber dafür vorgesehen. 2,8 A ist ja schon ne Menge Strom... Also, nicht verzagen, fleißig messen und weniger fragen und wenn fragen, dann bitte mit entsprechender Info. Also Schaltplan, vielleicht Programm, damit ausgeschlossen werden kann, das Ausgänge direkt kurzgeschlossen sind. Übrigends, wenn du einen Ausgang schnell von Low nach High hin und her schaltest, sollte da kein Kondensator angeschlossen sein. Je nach Kapazität wirkt das auch wie ein Kurzschluss. Gruß oldmax
Martin Vogel schrieb: > Hallo Lars > Schön, das du eine Heizung gebaut hast. Wird ja jetzt bald Winter und da > ist es ja nicht so verkehrt, etwas gegen die Kälte zu haben. Ein > Elektroniker würde ja jetzt anfangen, nachzuschauen, wo der Strom > entsteht und vielleicht mithilfe von Skizzen die Wege ergründen. Daher > vermute ich mal, das du mal grade weißt, das Ampere das Maß für > elektrischen Strom ist. Nun ja, das ist ja schon mal etwas. Kommen wir > zum eigentlichen Kern deines Problems. Um eines mal klarzustellen, nur > mit einem Programm bekommst du den Rauch aus dem Chip nicht raus. Also > davon wird ihm nicht warm und schon gar nicht heiß. Also liegt es an > deiner Hardware. Vielleicht hast du ja die Vorwiderstände vor den LED's > weggelassen oder Hochstrom-LED's benutzt und keine Treiber dafür > vorgesehen. 2,8 A ist ja schon ne Menge Strom... > Also, nicht verzagen, fleißig messen und weniger fragen und wenn fragen, > dann bitte mit entsprechender Info. Also Schaltplan, vielleicht > Programm, damit ausgeschlossen werden kann, das Ausgänge direkt > kurzgeschlossen sind. Übrigends, wenn du einen Ausgang schnell von Low > nach High hin und her schaltest, sollte da kein Kondensator > angeschlossen sein. Je nach Kapazität wirkt das auch wie ein > Kurzschluss. > Gruß oldmax Ich lerne vieles in der Schule und beherrsche ein wenig Grundwissen. Mein problem ist auch dass, das Programm für ein 14,7xxxMHz Quarz ist. Ich habe allerdings einen 16MHz. Vorwiderstand ist bei jeder LED dabei, der Strom an PIN 10/11 und 30/31 kommt auch richtig an, nur eben etwas zu groß (2,8A / 5V). Ich werde mal einen anderen 7805 einsetzen um ca 1A zu haben. Leider kann ich meinen ATMEGA16 nicht mehr neu programmieren da er wen ich ihn an den Progger anschließe , dieser keinen Strom mehr hat (Die LED auf ihm erlischt langsam). Habe eben schon 2 neue gekauft. Die LED's haben auch alle den richtigen Widerstand un funktionieren einwandfrei auf meinem Breadboard.
:
Bearbeitet durch User
Lars U. schrieb: > Leider habe ich die Vermutung das ich den µC gehimmelt habe. Ja. Man nimmt ja auch zur Inbetriebnahme kein Netzteil, was 2,8A kann. Vermutlich hast Du einen Schaltungsfehler, d.h. ein neuer MC wird auch sofort durchbrennen. Der MC braucht max 20mA, d.h. ein Netzteil mit Strombegrenzung 100mA wäre richtig. Erst wenn man die LEDs anklemmt, kann man die Strombegrenzung höher drehen.
Hi Schön, das du mich zittierst, aber mir scheint, ich muss da noch ein wenig nachhaken: Mach von deiner Schaltung eine Skizze. Nicht deine Vorlage, sondern deinen Aufbau brauchen wir, wenn unsere Aussagen zutreffen sollen. Denn: Ein Programm treibt nicht den Strom hoch ! Auch die MHz sind nicht dein Problem, der Atmega16 kann durchaus 16 MHz. So richtig versteh ich deine Beschreibung auch nicht: Der 7805 wird jetzt auf 1 A ausgelegt? Welcher hat denn die fast 3 A geleistet, ohne Schweißperlen zu bekommen? Bist du dir sicher, das der Controller wirklich nur die für ihn gesunden 5 V bekommen hat ? Du weißt, wer zuviel isst wird dick und Controller tun das manchmal auch, wenn die Versorgung zu üppig ist. Außerdem, wie hoch war der Strom zu den LED's ? Hast du da mal gemessen? Soweit ich das von hier aus beurteilen kann, ist nur ein Schaltungsfehler möglich, den Controller derart heiß zu machen.... ich tippe mal "Spannung zu hoch " Gruß oldmax
http://obrazki.elektroda.pl/5944479000_1337370257.png Das ist die Schaltung, ich habe mir bei Conrad einen 7805 für 2A und einen für 1A gekauft , stimment tuht das aber nicht wirklich. Denn bei dem 1A bekomme ich nur 0.18 raus. Die LED bekommen garkein saft , am µC ist ca 5.08V auf beiden seiten.
Ich habe jetzt einen neuen µC mit eigenem Code und richtigem Crystal. Leider wird er immernoch heiß, ich habe zur sicherheit die Knöpfe am µC abgelötet und alles andere überprüft. (Wusste nich wie man sie anschließt, konnte es nur aus anderen Schaltung deuten. Heute werde ich mal versuchen an einen 7805 zu kommen bei dem ich 1A raus bekomme.
Aua. Der Regler liefert nicht 1 A. Er liefert bis zu 1 A. Er liefert 5 V und der Verbraucher nimmt soviel er braucht. Der Verbraucher bestimmt den Strom! Erst wenn die 1 A überschritten werden oder der Regler zu heiß wird nimmt dieser Einfluß auf den Stromfluß. Dann geht aber auch die Spannung in die Knie. Es gibt Spannugsregler und es gibt Stromregler. Es gibt aber keine Regler die beides gleichzeitig Regeln, sondern höchstens begrenzen.
Lars U. schrieb: > einen 7805 für 2A und > einen für 1A gekauft , stimment tuht das aber nicht wirklich. Denn bei > dem 1A bekomme ich nur 0.18 raus. Hmmmm.....ich fürchte, nach der Bemerkung gibt es nichts mehr, was einen Shitstorm im Forum noch aufhalten könnte. Mein Rat: Beschäftige Dich noch einmal mit den Grundlagen der Elektrotechnik und Elektronik. Mit Spannungen, Strom und Widerständen. Und mit LED-Vorwiderständen. Und dann zieh den ATmega aus dem Sockel und such nach dem Fehler auf der Leiterplatte - ohne Betriebsspannung mit dem Durchgangsprüfer, mit 5V Betriebsspannung mit dem Voltmeter. Mach Dir vorher klar, welche Spannung an welchem Punkt laut Schaltplan sein sollte und miß nach. Wenn Du keinen Schaltplan hast ist es jetzt an der Zeit einen zu zeichnen. Das Fehlen eines Schaltplans gehört zu den Sachen, die eigentlich immer bereut werden. Versuch anschließend die LEDs mit Drahtbrücken im Sockel einzeln zum leuchten zu bringen. Kurz: such den Fehler erst außerhalb des ATmegas, denn da wird mit Sicherheit einer sein. Vielleicht nicht ausschließlich. Aber da sein wird er - vermutlich ein Kurzschluß zwischen Leiterbahnen. Viele Grüße Nicolas
Naja das mit dem Strom lag am Elko ... Einen Schaltplan kann man in einem Post weiter oben sehen ... Der Strom am eingang stimmt auch, er wird jetzt auch nicht mehr heiß. Aber leider gibt er auf keinem Port strom, was er eigentlich tuen sollte.
:
Bearbeitet durch User
Ich habe jetzt auch deinen Rat befolgt und es mit Kabelbrücken gemacht, funktioniert 1A. http://obrazki.elektroda.pl/5944479000_1337370257.png S1-4
Ja, das wundert mich kein bisschen. Wie willst du ohne Treiber so viele LEDs betreiben? Von Programmierung hast du wohl keine Ahnung (Hilfe Programm ist für 14.xx Quarz, habe aber nur einen 16Mhz Quarz). Stell dir vor, das kann man einstellen. Und Mein 5V/1A Regler bringt nur 0.18A.. Hm komisch was. Mach doch mal den Versuch: Hänge einen 1Megaohm Widerstand deinen 5V Regler, wenn dann 1A fliesst hast du die Physik ausgehebelt mein Lieber! Gruss
Dave Chappelle schrieb: > Von Programmierung hast du wohl keine Ahnung (Hilfe Programm ist für > 14.xx Quarz, habe aber nur einen 16Mhz Quarz). Stell dir vor, das kann > man einstellen. Natürlich weiß ich das man das einstellen kann, allerdings hatte ich nur die HEX Datei ! Und habe eben alles nach dem Schaltplan oben gebaut. > > Und Mein 5V/1A Regler bringt nur 0.18A.. Hm komisch was. > Mach doch mal den Versuch: Hänge einen 1Megaohm Widerstand deinen 5V > Regler, wenn dann 1A fliesst hast du die Physik ausgehebelt mein Lieber! > > Gruss Wusste ich nicht...
Alles funktioniert soweit, allerdings gibt der µC auf keinem Port Strom. Hier mal den code den ich benutze, hauptsächlich geht es mir aktuell um die bootmsg welche leider nicht funktioniert :
1 | // ############################################ |
2 | // |
3 | // 4x4x4 LED Cube project |
4 | // By Christian Moen 2008 |
5 | // chr@syntaks.org |
6 | // Lisence: GPL |
7 | // |
8 | // ############################################ |
9 | |
10 | #include <avr/io.h> |
11 | #include <avr/interrupt.h> |
12 | #include <avr/pgmspace.h> |
13 | |
14 | // Define USART stuff |
15 | // CPU speed and baud rate: |
16 | #define FOSC 16000000 |
17 | #define BAUD 9600 |
18 | // Are used to calculate the correct USART timings |
19 | #define MYUBRR (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1) |
20 | |
21 | |
22 | // Define masks used for status LEDs and input buttons. |
23 | #define LED_GREEN 0x01 |
24 | #define LED_RED 0x02 |
25 | #define BUTTON 0x08 |
26 | // Define port used for status and input. |
27 | #define LED_PORT PORTB |
28 | #define BUTTON_PORT PORTB |
29 | |
30 | |
31 | // Define masks for the layer select. |
32 | #define LAYER1 0x80 |
33 | #define LAYER2 0x40 |
34 | #define LAYER3 0x20 |
35 | #define LAYER4 0x10 |
36 | #define LAYERS 0xf0 // All layers |
37 | #define LAYERS_R 0x0f // The inverse of the above. |
38 | #define LAYER_PORT PORTD |
39 | |
40 | // Define LED grid ports |
41 | // Each of the grid ports are connected to two rows of leds. |
42 | // The upper 4 bits is one row, the lower 4 bits are one row. |
43 | #define GRID1 PORTC |
44 | #define GRID2 PORTA |
45 | |
46 | |
47 | void ioinit (void); // initiate IO on the AVR |
48 | void bootmsg (void); // blink some leds to indicate boot or reboot |
49 | void delay_ms (uint16_t x); // delay function used throughout the program |
50 | void led_red(unsigned char state); // led on or off |
51 | void led_green(unsigned char state); |
52 | void launch_effect (int effect); // effect program launcher |
53 | |
54 | // *** Cube buffer *** |
55 | // The 3D image displayed on the cube is buffered in a 2d array 'cube'. |
56 | // The 1st dimension in this array is the Z axis of the cube. |
57 | // The 2nd dimension of the array is the Y axis. |
58 | // Each byte is a stripe of leds running along the X axis at the given |
59 | // Z and Y coordinates. |
60 | // Only the 4 lower bits are used, since the cube is only 4x4x4. |
61 | // This buffer design was chosen to have code compatability with a 8x8x8 cube. |
62 | // "volatile" makes the variables reachable from within the interrupt functions |
63 | volatile unsigned char cube[4][4]; |
64 | |
65 | // We sometimes want to draw into a temporary buffer so we can modify it |
66 | // before writing it to the cube buffer. |
67 | // e.g. invert, flip, reverse the cube.. |
68 | volatile unsigned char tmpcube[4][4]; |
69 | |
70 | // What layer the interrupt routine is currently showing. |
71 | volatile unsigned char current_layer; |
72 | |
73 | // Low level geometric functions |
74 | #include "draw.c" |
75 | |
76 | // Static animation data |
77 | #include "frames.c" |
78 | |
79 | // Fancy animations to run on the cube |
80 | #include "effect.c" |
81 | |
82 | |
83 | int main (void) |
84 | { |
85 | // Initiate IO ports and peripheral devices. |
86 | ioinit(); |
87 | |
88 | // Indicate that the device has just booted. |
89 | bootmsg(); |
90 | |
91 | int x; |
92 | int i; |
93 | int z; |
94 | |
95 | // Set the layer to start drawing at |
96 | current_layer = 0x00; |
97 | |
98 | // Enable interrupts to start drawing the cube buffer. |
99 | // When interrupts are enabled, ISR(TIMER2_COMP_vect) |
100 | // will run on timed intervalls. |
101 | sei(); |
102 | |
103 | // Main program loop. |
104 | while (1) |
105 | { |
106 | for (i=0;i<13;i++) |
107 | { |
108 | launch_effect(i); |
109 | } |
110 | // Comment the loop above and uncomment the line below |
111 | // if you want the effects in random order (produced some bugs.. ) |
112 | //launch_effect(rand()%13); |
113 | } |
114 | |
115 | } |
116 | |
117 | // Launches one of those fancy effects. |
118 | void launch_effect (int effect) |
119 | { |
120 | switch (effect) |
121 | { |
122 | // Lights all the layers one by one |
123 | case 0: |
124 | loadbar(1000); |
125 | break; |
126 | |
127 | // A pixel bouncing randomly around |
128 | case 1: |
129 | // blink |
130 | boingboing(150,500,0x03,0x01); |
131 | break; |
132 | |
133 | // Randomly fill the cube |
134 | // Randomly empty the cube |
135 | case 2: |
136 | fill(0x00); |
137 | random_filler(100,1,500,1); |
138 | random_filler(100,1,500,0); |
139 | break; |
140 | |
141 | // Send voxels randomly back and forth the Z axis |
142 | case 3: |
143 | sendvoxels_rand_z(150,500,2000); |
144 | break; |
145 | |
146 | // Spinning spiral |
147 | case 4: |
148 | effect_spiral(1,75,1000); |
149 | break; |
150 | |
151 | // A coordinate bounces randomly around the cube |
152 | // For every position the status of that voxel is toggled. |
153 | case 5: |
154 | // toggle |
155 | boingboing(150,500,0x03,0x02); |
156 | break; |
157 | |
158 | // Random raindrops |
159 | case 6: |
160 | effect_rain(20,5000,3000,500); |
161 | break; |
162 | |
163 | // A snake randomly bounce around the cube. |
164 | case 7: |
165 | // snake |
166 | boingboing(150,500,0x03,0x03); |
167 | break; |
168 | |
169 | // Spinning plane |
170 | case 8: |
171 | effect_spinning_plane(1,50,1000); |
172 | break; |
173 | |
174 | // set x number of random voxels, delay, unset them. |
175 | // x increases from 1 to 20 and back to 1. |
176 | case 9: |
177 | random_2(); |
178 | break; |
179 | |
180 | // Set all 64 voxels in a random order. |
181 | // Unset all 64 voxels in a random order. |
182 | case 10: |
183 | random_filler2(200,1); |
184 | delay_ms(2000); |
185 | random_filler2(200,0); |
186 | delay_ms(1000); |
187 | break; |
188 | |
189 | // bounce a plane up and down all the directions. |
190 | case 11: |
191 | flyplane("z",1,1000); |
192 | delay_ms(2000); |
193 | flyplane("y",1,1000); |
194 | delay_ms(2000); |
195 | flyplane("x",1,1000); |
196 | delay_ms(2000); |
197 | flyplane("z",0,1000); |
198 | delay_ms(2000); |
199 | flyplane("y",0,1000); |
200 | delay_ms(2000); |
201 | flyplane("x",0,1000); |
202 | delay_ms(2000); |
203 | break; |
204 | |
205 | // Fade in and out at low framerate |
206 | case 12: |
207 | blinky2(); |
208 | break; |
209 | } |
210 | } |
211 | |
212 | // ** Diagnostic led functions ** |
213 | |
214 | // Set or unset the red LED |
215 | void led_red(unsigned char state) |
216 | { |
217 | if (state == 0x00) |
218 | { |
219 | LED_PORT &= ~LED_RED; |
220 | } else |
221 | { |
222 | LED_PORT |= LED_RED; |
223 | } |
224 | } |
225 | |
226 | // Set or unset the green LED |
227 | void led_green(unsigned char state) |
228 | { |
229 | if (state == 0x00) |
230 | { |
231 | LED_PORT &= ~LED_GREEN; |
232 | } else |
233 | { |
234 | LED_PORT |= LED_GREEN; |
235 | } |
236 | } |
237 | |
238 | |
239 | // Cube buffer draw interrupt routine |
240 | ISR(TIMER2_COMP_vect) |
241 | { |
242 | |
243 | // AND the reverse bitmask onto the layer port. |
244 | // This disables all the layers. rendering all the leds off. |
245 | // We don't want to see the cube updating. |
246 | LAYER_PORT &= LAYERS_R; |
247 | |
248 | // Take the current 2D image at the current layer along the Z axis |
249 | // and place it on the LED grid. |
250 | GRID1 = (0x0f & cube[current_layer][0]) | (0xf0 & (cube[current_layer][1] << 4)); |
251 | GRID2 = (0x0f & cube[current_layer][2]) | (0xf0 & (cube[current_layer][3] << 4)); |
252 | |
253 | // Enable the apropriate layer |
254 | LAYER_PORT |= (0x01 << (7 - current_layer)); |
255 | |
256 | // The cube only has 4 layers (0,1,2,3) |
257 | // If we are at layer 3 now, we want to go back to layer 0. |
258 | if (current_layer++ == 3) |
259 | current_layer = 0; |
260 | } |
261 | |
262 | void ioinit (void) |
263 | { |
264 | // ### Initiate I/O |
265 | |
266 | // Data Direction Registers |
267 | // Bit set to 1 means it works as an output |
268 | // Bit set to 1 means it is an input |
269 | DDRA = 0xff; // Inner cube byte |
270 | DDRB = 0xf7; // ISP and 0-1: led. 3: button |
271 | DDRC = 0xff; // Outer cube byte |
272 | DDRD = 0xff; // Layer select |
273 | |
274 | // Set all ports OFF, and enable pull up resistors where needed. |
275 | PORTA = 0x00; |
276 | PORTC = 0x00; |
277 | PORTB = 0x08; // Enable pull up button. |
278 | PORTD = 0x00; |
279 | |
280 | // ### Initiate timers and USART |
281 | |
282 | // Frame buffer interrupt |
283 | TCNT2 = 0x00; // initial counter value = 0; |
284 | TIMSK |= (1 << OCIE2); // Enable CTC interrupt |
285 | |
286 | // Every 1024th cpu cycle, a counter is incremented. |
287 | // Every time that counter reaches 15, it is reset to 0, |
288 | // and the interrupt routine is executed. |
289 | // 14745600/1024/15 = 960 times per second |
290 | // There are 4 layers to update.. |
291 | // 14745600/1024/15/4 = 240 FPS |
292 | // == flicker free :) |
293 | OCR2 = 15; // interrupt at counter = 15 |
294 | TCCR2 = 0x05; // prescaler = 1024 |
295 | TCCR2 |= (1 << WGM01); // Clear Timer on Compare Match (CTC) mode |
296 | |
297 | |
298 | // Initiate RS232 |
299 | // USART Baud rate: 9600 |
300 | UBRRH = MYUBRR >> 8; |
301 | UBRRL = MYUBRR; |
302 | // UCSR0C - USART control register |
303 | // bit 7-6 sync/ascyn 00 = async, 01 = sync |
304 | // bit 5-4 parity 00 = disabled |
305 | // bit 3 stop bits 0 = 1 bit 1 = 2 bits |
306 | // bit 2-1 frame length 11 = 8 |
307 | // bit 0 clock polarity = 0 |
308 | UCSRC = 0b10000110; |
309 | // Enable RS232, tx and rx |
310 | UCSRB = (1<<RXEN)|(1<<TXEN); |
311 | UDR = 0x00; // send an empty byte to indicate powerup. |
312 | |
313 | } |
314 | |
315 | |
316 | // Blink the status LEDs a little to indicate that the device has just booted. |
317 | // This is usefull to see if an error is making the device reboot when not supposed to. |
318 | // And it looks cool. |
319 | void bootmsg (void) |
320 | { |
321 | int i; |
322 | LED_PORT |= LED_GREEN; |
323 | for (i = 0; i < 2; i++) |
324 | { |
325 | // Blinky |
326 | delay_ms(1000); |
327 | LED_PORT &= ~LED_GREEN; |
328 | LED_PORT |= LED_RED; |
329 | // Blink |
330 | delay_ms(1000); |
331 | LED_PORT &= ~LED_RED; |
332 | LED_PORT |= LED_GREEN; |
333 | } |
334 | delay_ms(1000); |
335 | LED_PORT &= ~LED_GREEN; |
336 | } |
337 | |
338 | |
339 | // Delay function used in graphical effects. |
340 | void delay_ms(uint16_t x) |
341 | { |
342 | uint8_t y, z; |
343 | for ( ; x > 0 ; x--){ |
344 | for ( y = 0 ; y < 90 ; y++){ |
345 | for ( z = 0 ; z < 6 ; z++){ |
346 | asm volatile ("nop"); |
347 | } |
348 | } |
349 | } |
350 | } |
:
Bearbeitet durch User
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.