Forum: Mikrocontroller und Digitale Elektronik programmieren funktioniert nicht


von Matthias B. (Firma: home) (biri)


Lesenswert?

hallo leute...

ich bin noch relativ neu unterwegs mit µC und dadurch kann meine frage 
womöglich peinlich erscheinen....
ich binn gerade dabei das ich mir eine garagentoorsteuerung baue und 
will das ganze von einem µC steuern....
ich habe, nur um zu sehen ob das programmieren funktioniert folgendes 
programm eingegeben:
1
#include <avr/io.h>
2
3
4
void main(void)
5
{
6
  volatile uint16_t i;
7
  volatile uint16_t ii;
8
  
9
  //PORT C Output;
10
  DDRC = 0xFF;
11
  
12
  PORTC = 0xff;  // Port C BitMuster 1111 1111
13
  
14
  while(1)
15
  {
16
     
17
    for(ii=0; ii<4; ii++)
18
    {
19
      for(i=0;i<40000;i++);
20
    }
21
   
22
    PORTC =~ PORTC; // Port C invertieren
23
  } 
24
25
}
und bekomm dabei folgenden fehler herraus:
1
> "make.exe" program
2
avrdude -p atmega16 -P avrdoper -c stk500v2     -U flash:w:code_basic.hex 
3
4
avrdude: stk500v2_command(): command failed
5
avrdude: stk500v2_command(): command failed
6
avrdude: stk500v2_program_enable(): cannot get connection status
7
avrdude: initialization failed, rc=-1
8
         Double check connections and try again, or use -F to override
9
         this check.
10
11
12
avrdude done.  Thank you.
13
14
make.exe: *** [program] Error 1
15
16
> Process Exit Code: 2
17
> Time Taken: 00:01

tja nun hab ich mir die frage gestellt wo wohl der fehler liegt, am µC 
an meinem programm oder an was anderem...^^
würd mich freuen wenn ihr mir troz meiner unglaublichen unwissenheit 
weiterhelfen könnt!!

von G4s7 (Gast)


Lesenswert?

Prinzipiell sieht es nicht so aus, als würde es eher an der Verbindung 
zum µC liegen und nicht am Code.
Wenn du deine Verbindung nochmal überprüft hast du es geht solltest du 
aber zum probieren mal den Code aus dem AVR-GCC-Tutorial nutzen und 
das Delay nicht durch solche Schleifen machen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
    for(ii=0; ii<4; ii++)
2
    {
3
      for(i=0;i<40000;i++);
4
    }
Das wirft ein halbwegs gescheiter Compiler einfach raus. Weil dort rein 
gar nichts passiert.

> Double check connections and try again
Welche Hardware und welche Software verwendest du?

von g457 (Gast)


Lesenswert?

>        Double check connections and try again

Damit solltest Du mal anfangen (Finger weg vom '-F'!). Ist der µC neu? 
Dann ist er wahrscheinlich zu langsam (bzw. der Prommer zu schnell), 
hier hilft ein '-B 10' für den avrdude.

Falls es dann noch immer nicht geht kann man weiter sehen.

HTH

von blablub (Gast)


Lesenswert?

Lothar Miller schrieb:
> Das wirft ein halbwegs gescheiter Compiler einfach raus. Weil dort rein
> gar nichts passiert.

Aber nur wenn du entsprechende Performance-Optimizations angibst. Falls 
du das nicht tust und der Compiler das raushaut, ist der Compiler nicht 
nutzenswert. Überhaupt sollten Compiler sowas nur auf dem aggresivsten 
Level weg optimieren.

Fehlermeldung sieht wohl danach aus, dass keine Verbindung zum 
Programmer aufgenommen werden kann. Ist wohl eine Fehleinstellung vom 
avrdude. Welchen Programmer nutzt der OP?

von Matthias B. (Firma: home) (biri)


Lesenswert?

oke also:
programm verwende ich winAVR-programmersnotepad
der programmer is im anhang und ich hab euch den schaltplan meiner 
schaltung auch gleich dazu gegeben....

ich weiß nicht obs ein neuer µC ist den hat mir mein lehrer 
geschenkt...also nehm ichs mal an

von Matthias B. (Firma: home) (biri)


Angehängte Dateien:

Lesenswert?

tschuldigung hab ich ein bischen zu früh abgeschickt...!! ^^

von g457 (Gast)


Lesenswert?

Hast Du RESET angeschlossen (an den ISP-Header)? Im Schaltplan ists 
ebendort zwar benannt, die verbindende Linie fehlt aber.

> ich weiß nicht obs ein neuer µC ist den hat mir mein lehrer
> geschenkt...also nehm ichs mal an

..da würde ich eher vom Gegenteil ausgehen.. :-)

von Matthias B. (Firma: home) (biri)


Lesenswert?

ja der reset is abgeschlossen....
(ist wie w-lan die verbindung ist da aber man siehts nicht...kleiner 
scherz)

ja nun steh ich hald wieder vor dem problem was soll ich machen...??

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

OT:
> sollten Compiler sowas nur auf dem aggresivsten Level weg optimieren.
Neinein, sowas sollte überhaupt nicht programmiert werden, denn es ist 
in keinster Weise portabel, denn in einem C-Programm ist kein Zeitbezug 
dargestellt. Mir wäre es am liebsten, wenn jeder meiner Befehle mit 
einem Zeitaufwand von 0 ausgeführt werden würde. Und damit wird 
natürlich auf meinem optimalen Rechner auch das Zählen auf 3000000000 
mit 0 Zeitaufwand ausgeführt. Es ist nirgends festgelegt, dass eine 
leere Zähleschleife eine Dauer hätte. Es funktioniert nur, wenn man den 
Compiler dazu zwingt.

Wenn ich eine Zeit will, dann schreibe ich das explizit hin (z.B. mit 
einer dementsprechend lautenden Funktion oder einem Timer).

Wenn man neu anfängt, sollte man sich diesen alten Programmierstil 
(Verzögerung per nackter for-Schleife) nicht mehr anlernen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> der programmer is im anhang
Hat der Programmer schon mal woanders funktioniert?
Oder ist da noch der nackte AVR drauf?

von g457 (Gast)


Lesenswert?

Geh mal die AVR-Checkliste [1] durch. Dann brems den Prommer aus mit '-B 
10' (..oder auch versuchsweise mit 20).

Sodann schnapp Dir ein Mulimeter oder besser ein Oszi falls greifbar. 
Damit überprüfst Du..
- RESET ist high
- RESET geht low wenn der Prommer prommen will
- auf SCK und MOSI kommen Daten wenn der Prommer prommen will
- auf MISO kommen Daten zurück

Ich gehe davon aus, dass bis hierher mindestens ein Test fehlschlagen 
wird. Die Frage ist welcher :-)

Achja war der Prommer schon mal irgendwoanders erfolgreich im Einsatz 
(vulgo ist ∗sicher∗ dass der funktioniert?)

HTH und viel Erfolg!

[1] http://www.mikrocontroller.net/articles/AVR_Checkliste

von huibu (Gast)


Lesenswert?

Lothar Miller schrieb:
> Neinein, sowas sollte überhaupt nicht programmiert werden, denn es ist
> in keinster Weise portabel, denn in einem C-Programm ist kein Zeitbezug
> dargestellt

Der Compiler soll in erster Linie eine formale Spezifikation umsetzen. 
Wenn ich so etwas, aus welchen Gruenden auch immer, programmiere, dann 
hat das der Compiler nur zu optimieren, wenn ich ihn explizit dazu 
auffordere.

Mehr gibts dazu nicht zu sagen. Deine Wunschvorstellung in allen Ehren, 
aber so sollte es nicht sein.

von Hubert G. (hubertg)


Lesenswert?

Solltest du gar nicht zurecht kommen kannst du mich unter 
www.schorsch.at kontaktieren. Bin in der Nähe von Leondig.

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.