Forum: Mikrocontroller und Digitale Elektronik Mein erstes Programm mit C


von Robin F. (gehacktes)


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.

von Düsendieb (Gast)


Lesenswert?

Schaltplan als PNG und das Programm sind schon notwendig

von Ralf (Gast)


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

von Der Lars (Gast)


Lesenswert?

Wie heißt das Simulationsprogramm?

von Peter D. (peda)


Lesenswert?

Robin Fehrecke schrieb:
> Woran könnte es liegen?

An Deinem Geiz mit Informationen.

Schaltplan (PDF, PNG), Source (C, ASM) als Anhang ist das Mindeste.


Peter

von Robin F. (gehacktes)


Angehängte Dateien:

Lesenswert?

Also das Programm heißt isis7.

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. Und das brennen des Atmels ist nach Brennprogramm auch 
erfolgreich verlaufen

von Karl H. (kbuchegg)


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.

von Michael B. (planlessmichi)


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?

von Robin F. (gehacktes)


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

von Karl H. (kbuchegg)


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.

von Klaus W. (mfgkw)


Lesenswert?


von Karl H. (kbuchegg)


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.

von dasrotemopped (Gast)


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

von Karl H. (kbuchegg)


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.

von dasrotemopped (Gast)


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

von ... .. (docean) Benutzerseite


Lesenswert?

dasrotemopped schrieb:
> Wie hoch ist denn der Einganswiderstand von einem Ausgang bei LOW ?

sollte nah 0 sein, meinst nicht auch.... ;)

von Karl H. (kbuchegg)


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)

von dasrotemopped (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


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

von Maxx (Gast)


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.

von Robin F. (gehacktes)


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);

 }
}

von Karl H. (kbuchegg)


Lesenswert?

Robin Fehrecke schrieb:

>    PORTB =0b11111010;
>    PORTC =0b00000011;

Ich denke mal es liegt daran, dass du versuchst hier 4 LED auf einmal 
einzuschalten. Bei deinen Widerstandwerten wird das für den Mega schon 
ein bischen viel. Nimm davon Abstand. Selbst bei nur 1 LED betreibst du 
den Mega schon hart an der Grenze dessen was er Strom liefern kann.

von Robin F. (gehacktes)


Lesenswert?

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 
xD

von Robin F. (gehacktes)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Robin F. (gehacktes)


Lesenswert?

ja nein sollst du auch nicht wollt es nur wissen...danke für die vielen 
beiträge... ich werde mich jetz mal dran setzen und weiter probieren

von Karl H. (kbuchegg)


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.

von maddin (Gast)


Lesenswert?

He!?

ich dachte das C hat schon mal geleuchtet... man man...Wo íst dein Code?

m.

von Robin F. (gehacktes)


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!!!

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
Noch kein Account? Hier anmelden.