Hallo zusammen!
Ich bin gerade dabei eine Led-Matrix anzusteuern und habe im Moment
folgendes Problem - vielleicht sieht ja jemand gleich meinen Fehler oder
kann mich aufklären....
Und zwar steuere ich mit IRF9622 P-Mosfets meine Zeilen an und spalten
über Konstantstrom-LED-Treiber-ICs.
[http://docs-asia.electrocomponents.com/webdocs/0029/0900766b80029c31.pdf]
Gate über 47 Ohm an Pin des µC, Source an 5V und Drain an die Gemeinsame
Anode meiner LED-Zeile.
Beim Atmega 48 (mehrere!) und einem 88 PDIP hatte ich den Port D
verwendet, wobei PD0, PD1 & PD2 okay waren und die Zeilen ordentlich
geschaltet haben, sind die anderen irgendwo zwischen 0V und 5V (meistens
so bei 2V) in der Luft gehangen. (Auch beim Test, der nur jede Sekunde
die Zeile umgeschaltet hat!)
Ich dachte mir, ich versuchs mit nem 48P in SMD...und siehe da - alle
Pins (selbe Beschaltung, selbe Pins) können meine Zeilen schalten!
Kann es also sein, dass die internen Treiber da verschiedene Leistungen
haben oder hab ich irgendwas anderes übersehen?
Okay...das Problem schon fast wieder verdrängt hab ich gestern die
Endgültige Platine mit nem größeren Atmega mit mehr Pins fertig gemacht
(Atmega1284P) und die Zeilen an Port C gehängt...und was stelle ich
fest? Es gehen wieder nur 3 Zeilen!...Ich habe gerade gelesen, dass ich
JTAG in den Fuses deaktivieren muss, da hier auf Port C der JTAG liegt
und das evtl. Probleme gibt - das muss ich heut Abend nochmal
überprüfen, aber meine Atmegs48s haben ja gar kein JTAG, dass es an
sowas hätte liegen können...
Liegts an meiner äußeren Beschaltung, den Mosfets, an den Atmegas, an
den Fuses, an meim Code...oder bin ich einfach zu blöd?!^^
Vielen Dank schon mal!
LG termi
Hier der relevante Code:
1 | //define display lines
|
2 | #define ROWS_PORT PORTC
|
3 | #define ROWS_DDR DDRC
|
4 |
|
5 | #define ROW1 PC1
|
6 | #define ROW2 PC3
|
7 | #define ROW3 PC5
|
8 | #define ROW4 PC6
|
9 | #define ROW5 PC4
|
10 | #define ROW6 PC2
|
11 | #define ROW7 PC0
|
12 |
|
13 | //INIT
|
14 | //set all pins connected to line drivers as output and switch all lines off
|
15 | ROWS_DDR |= ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
16 | ROWS_PORT &= ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
17 |
|
18 |
|
19 | //ISR
|
20 | //switch to next line
|
21 | switch (line){
|
22 | case 0: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
23 | break;
|
24 | case 1: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
25 | break;
|
26 | case 2: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW2) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
27 | break;
|
28 | case 3: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7));
|
29 | break;
|
30 | case 4: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW6) | (1 << ROW7));
|
31 | break;
|
32 | case 5: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW7));
|
33 | break;
|
34 | case 6: ROWS_PORT = (ROWS_PORT & ~((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7))) | ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6));
|
35 | break;
|
36 | default: ROWS_PORT = (ROWS_PORT | ((1 << ROW1) | (1 << ROW2) | (1 << ROW3) | (1 << ROW4) | (1 << ROW5) | (1 << ROW6) | (1 << ROW7)));
|
37 | //TODO: Error-LED on
|
38 | return;
|
39 | }
|
btw. hat jemand ne Idee, ob man den Code noch iwie optimieren könnte? In
Asm könnte man sich ja was mit relativen Sprüngen mit dem Wert der
Zeilenvariablen ausdenken...wüsste nicht, dass man sowas in C auch
hinbekommen könnte - oder?