Mein erstes Programm mit C

OP #1894083
Lesenswert?

Hallo zusammen,

Ich habe ein kleines aber nerviges Problem. Also ich habe mir ein 
kleines LED Matrix Programm geschrieben was erstmal einfach nur ein C 
anzeigen soll.
So nun zu mein Problem:

Ich habe das Programm fertig gestellt und mit einem Simulationsprogramm 
auf meinem Rechner ausgetest. Ich habe es dann einmal ausprobiert und 
der hat mir ein C angezeigt. So nun dachte ich: Jipi es funktioniert 
kann ich es ja mal auf einer richtigen Platine bauen und austesten.
So hab alles genauso aufgebaut wie es im Simulationsprogramm aufgebaut 
is aber aufmeiner Platine will die sch**** nicht klappen.?
Woran könnte es liegen?

Mfg Gehacktes

Wenn es notwendig is mach ich auch ein Foto meiner Platinen bestückung 
und pack das Programm rein.
Gast #1894091
Lesenswert?

> Woran könnte es liegen?
- Hardware falsch aufgebaut (Kurzschluss, etc.)
- Software passt nicht zum nicht näher erwähnten Controller (Speed, 
Fuses, etc.)
- Hardware hat an sich einen Bug
- ...

Liegen KÖNNEN könnte es an vielem... Die Frage ist: was hast du bereits 
alles geprüft?
Normalerweise macht man es so, dass die Hardware mit einem kleinen 
Programm geprüft wird, also ob der µC läuft etc.
Danach wird angefangen die Software zu schreiben, und zwischendrin immer 
mal wieder auf die Hardware gepustet, um zu sehen, ob's zumindest im 
groben noch funktioniert. So mache ich es zumindest, weil ich nicht am 
Ende der Software feststellen möchte, dass ein Mist den ich am Anfang 
programmiert habe mir den ganzen Ansatz verbeult hat -> das kann 
manchmal alles über'n Haufen werfen...

Ralf
#1894184
Lesenswert?

Robin Fehrecke schrieb:

> Und was hab ich bisher getestet? Also ich habe wie gesagt das Programm
> getestet in meiner Simulation, dann habe ich die Schaltung soweit auich
> getestet gehabt.

Das ist eben der Unterschied zwischen einer Simulation und der Realität. 
In einer Simulation kann man niemals alle Aspekte der Realität 
nachbilden.

> Und das brennen des Atmels ist nach Brennprogramm auch
> erfolgreich verlaufen

Davon gehen wir sowieso implizit aus.

Trotzdem solltest du erst mal, wie weiter oben schon vorgeschlagen, mit 
kleineren einfacheren Testprogrammen deine Hardware durchtesten.
Eine einzelne LED an einen Portpin (+Vorwiderstand). Led einschalten, 
Led ausschalten, LED blinken lassen.
#1894187
Lesenswert?

Hm... Also beim Atmega fehlen ja schon ein paar Teile...
Ist der Schaltplan so wirklich komplett? Oder hast du uns hier nur 
schnelle eine Zeichnung erstellt?
Wie hast Du z.B. das Teil geflasht, ohne Anschlüsse?

Dann solltest Du noch den Reset-Anschluss (PC6) mit einem 10k an VCC 
anschließen. Wenn der, wie bei dieser Zeichnung in der Luft hängt, ist 
das evtl. auch ungünstig.

Hast Du beim Flashen evtl. auch gleich dies Fuses mit verstellt? Läuft 
der interne RC-Oszillator noch? Kannst Du das Teil auch jetzt noch 
ansprechen?
OP #1894223
Lesenswert?

Also mit einem Lauflicht habe ich es auch schon ausprobiert und klappt 
auch nicht. Es kann sein das ich vlt nicht alles vollständig 
angeschlossen habe.also wenn ihr mir evtl. einen Schaltplan zeigen 
könntet wie er denn eurer Meinung nach vollständig angeschlossen wird 
wäre das nett Dann probiere ich das heute einmal aus. Und ja auf jeden 
fall habe ich das auch mit einem externen quarz ausprobiert^^ soviel 
kann ich sagen. Also wie gesagt mit Atmega und c kenn ich mich halt noch 
net so gut aus und von daher kann es gut sein das da irgendein anschluss 
fehlt.

Mfg Gehacktes
#1894234
Lesenswert?

Robin Fehrecke schrieb:
> Also mit einem Lauflicht habe ich es auch schon ausprobiert und klappt
> auch nicht.

Ach.
Und du denkst, dass eine Matrix multiplexen einfacher ist als ein 
Lauflicht.

Wenn Lauflicht nicht geht, dann einzelne LED!

Schluck deinen Stolz runter und schalte 1 LED ein. Das ist der einfachst 
mögliche Fall. Solange der nicht funktioniert hat es keinen Sinn da noch 
mehr Komplexität draufzupacken!

> Es kann sein das ich vlt nicht alles vollständig
> angeschlossen habe.

Was soll das bedeuten?
Hast du oder hast du nicht?

> also wenn ihr mir evtl. einen Schaltplan zeigen
> könntet wie er denn eurer Meinung nach vollständig angeschlossen wird

Dein Schaltplan ist zwar nicht vollständig, der AtMega sollte damit aber 
ein erstes Lebenszeichen von sich geben. Dass du ohne Probleme flashen 
kannst, ist schon mal ein gutes Zeichen.

> wäre das nett Dann probiere ich das heute einmal aus. Und ja auf jeden
> fall habe ich das auch mit einem externen quarz ausprobiert^^ soviel
> kann ich sagen.

Was genau hast du ausprobiert?
Hast du an den Fuse-Bits rumgespielt?

> Also wie gesagt mit Atmega und c kenn ich mich halt noch
> net so gut aus

Ein Grund mehr erst mal mit einfachen Dingen anzufangen.
Eine Matrix multiplexen ist nicht einfach.
#1894240
Lesenswert?

1
#include <avr/io.h>
2

3
int main()
4
{
5
  DDRC = (1<<PC0) | (1<<PC1) | (1<<PC2);
6
  DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2);
7

8
  PORTB &= ~(1<<PB0);
9
  PORTC |=  (1<<PC2);
10

11
  while(1)
12
    ;
13
}

brenn dieses Programm auf deinen Mega.
Danach müsste 1 LED leuchten.
Wenn sie das nicht tut, dann miss mit einem Voltmeter die Pegel an PB0 
bzw. PC2 nach. PB0 muss auf 0 (also 0V) sein, PC2 muss auf 1 (also 5V 
sein).
Wenn die Pegel stimmen, dann gibt es noch die Möglichkeit, dass du die 
LED verkehrt herum eingelötet hast.

Wenn die Pegel nicht stimmen, dann muss man weitersehen.
Gast #1894565
Lesenswert?

Sehe ich das richtig, über PC0-2 wird das Bitmuster
an die LEDs ausgegeben, die leuchten sollen und über
PB0-2 wird der Port auf Low gezogen, dessen LED Zeile
aktiv sein soll ?
Die internen Pullups von 50kOhm vom atmel hast du dann
als zusätzliche Vorwiderstände an den LEDs, dazu noch
für 3 LEDs zusammen. Der Strom sollte zu gering sein
dass die LEDs leuchten.
Ich würde an PB0-2 Transistoren anschliessen, die eine
LED Zeile auf Ground zieht, dann sollte es gehen.

Gruß,

dasrotemopped
#1894575
Lesenswert?

dasrotemopped schrieb:

> Die internen Pullups von 50kOhm vom atmel hast du dann
> als zusätzliche Vorwiderstände an den LEDs,

an einem auf Ausgang geschalteten Port gibt es keine Pullups

> Ich würde an PB0-2 Transistoren anschliessen, die eine
> LED Zeile auf Ground zieht, dann sollte es gehen.

Das sowieso.
Aber lass uns erst mal etwas zum leuchten bringen. Er braucht ja auch 
ein Erfolgserlebnis. Und auch wenn es für den Mega erst mal eine Tortur 
ist, aushalten wird er es zunächst mal. Auf Dauer geht das natürlich 
nicht, das ist schon klar.
Gast #1894609
Lesenswert?

Ja, stimmt, als Ausgang hat der Atmel keine Pullups.
Wie hoch ist denn der Einganswiderstand von einem Ausgang bei LOW ?
Hab auf die schnelle keinen Hinweis im Datenblatt finden können.
Ggf. müsste ja der Vorwiderstand der LEDs angepasst werden.

Gruß,

dasrotemopped
#1894617
Lesenswert?

dasrotemopped schrieb:
> Ja, stimmt, als Ausgang hat der Atmel keine Pullups.
> Wie hoch ist denn der Einganswiderstand von einem Ausgang bei LOW ?
> Hab auf die schnelle keinen Hinweis im Datenblatt finden können.
> Ggf. müsste ja der Vorwiderstand der LEDs angepasst werden.

Die sind zur Zeit mit 38mA dimensioniert (100 Ohm Vorwiderstand, ich hab 
rote LED angenommen) und das ist ein bischen viel für den armen Mega. 
Bei mehr eingeschalteten LED wirds dann noch mehr in Richtung 
Überlastung.

(Nicht weitersagen: Auch wenn man das nicht macht, gleich geht der Mega 
nicht kaputt. Der steckt auch schon mal einen Kurzschluss an einem 
Ausgang weg. Klar: Für ein Gerät im Dauerbetrieb geht das natürlich 
nicht, aber auf dem Experimentierboard ist es nicht soooo schlimm)
Gast #1894732
Lesenswert?

warum nicht gleich die richtige Lösung zeigen ?
Wenn man an einem Problem hängt nicht das nächste
Problem in der Lösung einbauen.
Hier mal den Schaltplan, wie ich Ihn machen würde,
zur Software wurde hier ja schon genug gesagt.
Damits nicht zu einfach ist, die Widerstandswerte
müssen noch gewählt werden.
Gruß,

dasrotemopped
Angehängte Dateien:
#1894741
Lesenswert?

Ich muß wohl blind wie ein Maulwurf sein, denn ich habe bisher keine 
einzige Zeile Code vom Fragesteller sehen können.
Aber trotzdem wird hier heiß diskutiert.
Kopfschüttel.

Ich seh das als geschickte Masche, den fertigen Code zu bekommen, ohne 
selbst was gemacht zu haben.


Peter
Gast #1894788
Lesenswert?

dasrotemopped schrieb:
> Hier mal den Schaltplan, wie ich Ihn machen würde,

Soso. Was war nochmal mit bipolaren Transistoren ...

Ein Problem nur halb gelöst, dass sich mit dem Bewusstsein der 
Einschränkung vermeiden lässt gegen eine Version getauscht, die den 
gleiche Überlastung der Portpins (Hint: Neben den Zeilen sind auch die 
Spalten betroffen) erlaubt und eine neue Baustelle schon beim Leuchten 
keiner einzigen LED aufreisst.
OP #1894899
Lesenswert?

Karl heinz Buchegger... also ich habe das programm jetz einmal auf 
meinen atmel gebrannt und ausprobiert...also die LED die an PC2 
angeschlossen ist leuchtet schonmal :)...

Aber hab da eine Frage...an PA5, PA6, PC1 und PD1 liegt auch eine 1 an 
woran liegt das? Nach dem Programm zu folge dürften die dch garnet 
leuchten oder?^^ Sy wie gesagt bin noch neu in dem Thema xD

Ach und hier mal mein Prgramm von der LED_Matrix wo von die Frage 
ausging xD:

#include <avr/io.h>     // Namen der IO Register
#include <util/delay.h> // Funktionen zum warten
// Achtung, damit delay richtig funktioniert muß mit Optimierung 
compiliert werden

int main(void)
{
 DDRB = 0xff;         // alle B pins als ausgang konfigurieren
 PORTB = 0xff;           // erstmal alles abstellen
 DDRC = 0xff;
 PORTC = 0xff;

 while (1)
 {

   PORTB =0b11111010;
   PORTC =0b00000011;
   _delay_ms(10);

   PORTB =0b11111101;
   PORTC =0b00000100;
   _delay_ms(10);

 }
}
#1894970
Lesenswert?

Robin Fehrecke schrieb:
> okey aber jetz mal zu deinem Programm...ist das normal das so viele leds
> leuchten??? kapiers net xD weil du sagtest ja es leuchtet dann nur eine
> xDv

?
Ja.
So ist das Testprogramm.

Ich wollte nur wissen
* ob dein µC läuft
* ob du Programm korrekt zum µC übertragen kannst
* ob die LED korrekt angeschlossen ist (POlung)

Am ANfang des Threads wussten wir das alles noch nicht. Jetzt mit dem 
testprogramm wissen wir das.

Ab jetzt darfst du übernehmen. Ich mach dir doch nicht dein Programm fix 
fertig.
#1894977
Lesenswert?

Robin Fehrecke schrieb:
> okey aber jetz mal zu deinem Programm...ist das normal das so viele leds
> leuchten??? kapiers net xD weil du sagtest ja es leuchtet dann nur eine
> xDv

Ach
Jetzt hab ichs erst verstanden.

Bei dir leuchten mehr LED und nicht nur eine.

Ja du hast recht.
Das ist ein Fehler im Testprogramm (hab nicht darauf geachtet)
1
#include <avr/io.h>
2

3
int main()
4
{
5
  DDRC = (1<<PC0) | (1<<PC1) | (1<<PC2);
6
  DDRB = (1<<PB0) | (1<<PB1) | (1<<PB2);
7

8
  PORTB = 0b00000110;
9
  PORTC = 0b00000100;
10

11
  while(1)
12
    ;
13
}

jetzt leuchtet nur noch eine.
OP #1894997
Lesenswert?

#include <avr/io.h>     // Namen der IO Register
#include <util/delay.h> // Funktionen zum warten
// Achtung, damit delay richtig funktioniert muß mit Optimierung
compiliert werden

int main(void)
{
 DDRB = 0xff;         // alle B pins als ausgang konfigurieren
 PORTB = 0xff;           // erstmal alles abstellen
 DDRC = 0xff;
 PORTC = 0xff;

 while (1)
 {

   PORTB =0b11111010;
   PORTC =0b00000011;
   _delay_ms(10);

   PORTB =0b11111101;
   PORTC =0b00000100;
   _delay_ms(10);

 }
}

das ist der Code für die matrix!!!

Also das C habe ich in einem Simulator darstelen können aber nicht bei 
meiner hardeware!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren