Forum: Mikrocontroller und Digitale Elektronik Programm startet nicht richtig


von Alex (Gast)


Lesenswert?

Hallo,
Ich will auf meiner STK500 alle LED's zum Leuchten bringen. Ich verwende 
einen ATmega162. Doch wenn ich die Hex-Datei in den Flashspeicher Lade, 
leuchten die LED's nur kurz auf.

AVR-Studio log:
Getting isp parameter.. SD=0x03 .. OKOK
Reading FLASH input file.. OK
Setting mode and device parameters.. OK!
Entering programming mode.. OK!
Erasing device.. OK!
Programming FLASH ..      OK!
Leaving programming mode.. OK!

Code:
1
#include <avr/io.h>
2
 
3
int main (void) {
4
   //Pin 1-8 an PortB als Ausgäne definieren
5
  DDRB = 
6
    ( 1 << DDB0 ) |
7
    ( 1 << DDB1 ) |
8
    ( 1 << DDB2 ) |
9
    ( 1 << DDB3 ) |
10
    ( 1 << DDB4 ) |
11
    ( 1 << DDB5 ) |
12
    ( 1 << DDB6 ) |
13
    ( 1 << DDB7 );
14
15
  //Pin 1-8 an PortB auf hi schalten
16
  PORTB |= 
17
    ( 1 << PB0 ) |
18
    ( 1 << PB1 ) |
19
    ( 1 << PB2 ) |
20
    ( 1 << PB3 ) |
21
    ( 1 << PB4 ) |
22
    ( 1 << PB5 ) |
23
    ( 1 << PB6 ) |
24
    ( 1 << PB7 );
25
26
    while(1) {
27
    //gogogo
28
    }                      
29
 
30
    return 0;
31
}

Der RESET-Jumper auf der STK500 ist entfernt. Ich programmiere mit AVR 
ISP mkII.

Grüße Alex

von David M. (md2k7)


Lesenswert?

Dein Programm wird höchstwahrscheinlich funktionieren...

[Glaskugel (hab leider kein STK500)]
Die LEDs sind gegen Vcc angeschlossen und leuchten demgemäß, wenn der 
Ausgang logisch LOW ist, also eine 0 ausgegeben wird.
[/Glaskugel]

Dann müsstest du schreiben:
1
  PORTB &= 
2
    ~( 1 << PB0 ) &
3
    ~( 1 << PB1 ) &
4
    ~( 1 << PB2 ) &
5
    ~( 1 << PB3 ) &
6
    ~( 1 << PB4 ) &
7
    ~( 1 << PB5 ) &
8
    ~( 1 << PB6 ) &
9
    ~( 1 << PB7 );

oder einfacher PORTB = 0;

;)

NACHTRAG: Korrektur - natürlich müssen die einzelnen Bitwerte hier mit 
UND verknüpft werden, sonst kommt Schwachsinn raus

von AVRFan (Gast)


Lesenswert?

1
  PORTB &= 
2
    ~( 1 << PB0 ) &
3
    ~( 1 << PB1 ) &
4
    ~( 1 << PB2 ) &
5
    ~( 1 << PB3 ) &
6
    ~( 1 << PB4 ) &
7
    ~( 1 << PB5 ) &
8
    ~( 1 << PB6 ) &
9
    ~( 1 << PB7 );

Ich halte diese Schreibweise für vorteilhafter:
1
  PORTB = 
2
    ( 0 << PB0 ) |
3
    ( 0 << PB1 ) |
4
    ( 0 << PB2 ) |
5
    ( 0 << PB3 ) |
6
    ( 0 << PB4 ) |
7
    ( 0 << PB5 ) |
8
    ( 0 << PB6 ) |
9
    ( 0 << PB7 );

Möchte man irgendwelche Bits auf 1 statt auf 0 haben, ändert man einfach 
die entsprechende 0 in eine 1.  Die Notation bleibt dabei 
angenehmerweise immer gleich: es kommen nur die Zeichen "0", "1", "<<", 
die Bitbezeichner, sowie "|" drin vor, niemals jedoch "&" und "~".

von Johannes M. (johnny-m)


Lesenswert?

@AVRFan:
Deine Schreibweise scheitert aber in dem Moment kläglich, wenn am Port 
Bits sind, deren Zustand aktuell nicht bekannt ist, die aber unverändert 
bleiben sollen...

Also generell:
1
//Bits setzen:
2
PORTx |= (1 << BIT1) | (1 << BIT2); //...usw.
3
4
//Bits löschen:
5
PORTX &= ~((1 << BIT1) | (1 << BIT2)); //...usw.
In beiden Fällen bleiben sämtliche Bits, die nicht explizit erwähnt 
werden, unverändert.

Die "Nullen-Schieberei" könnte auch dazu führen, dass gewisse Anfänger 
denken, es hätte irgendeinen Effekt, eine Null in der Gegend 
rumzuschieben.

von OliverSo (Gast)


Lesenswert?

RTFM

Die Glaskugel von AVRFan hat recht.
1
#include <avr/io.h>
2
 
3
int main (void) {
4
   //Pin 1-8 an PortB als Ausgäne definieren
5
  DDRB = 0xff;
6
  //Pin 1-8 an PortB auf low schalten
7
  PORTB = 0; // kann man sich hier auch schenken, noch Nuller als Null gehts nicht
8
9
    while(1) {
10
    //gogogo
11
    }                      
12
 
13
    return 0;
14
}

sollte funktionieren.

Oliver

von Alex (Gast)


Lesenswert?

Habs jetzt so versucht funktioniert immer noch ned :-/
1
#include <avr/io.h>
2
 
3
int main (void) {
4
   //Pin 1-8 an PortB als Ausgäne definieren
5
  DDRB = 
6
    ( 1 << DDB0 ) |
7
    ( 1 << DDB1 ) |
8
    ( 1 << DDB2 ) |
9
    ( 1 << DDB3 ) |
10
    ( 1 << DDB4 ) |
11
    ( 1 << DDB5 ) |
12
    ( 1 << DDB6 ) |
13
    ( 1 << DDB7 );
14
15
  //Pin 1-8 an PortB auf hi schalten
16
  PORTB |= 
17
    ( 0 << PB0 ) |
18
    ( 0 << PB1 ) |
19
    ( 0 << PB2 ) |
20
    ( 0 << PB3 ) |
21
    ( 0 << PB4 ) |
22
    ( 0 << PB5 ) |
23
    ( 0 << PB6 ) |
24
    ( 0 << PB7 );
25
26
    while(1) {
27
    //gogogo
28
    }                      
29
 
30
    return 0;
31
}

Grüße..

von Alex (Gast)


Lesenswert?

Ahh Sorry so hab ichs jetzt, geht aber immer noch ned:
1
#include <avr/io.h>
2
 
3
int main (void) {
4
   //Pin 1-8 an PortB als Ausgäne definieren
5
  DDRB = 
6
    ( 1 << DDB0 ) |
7
    ( 1 << DDB1 ) |
8
    ( 1 << DDB2 ) |
9
    ( 1 << DDB3 ) |
10
    ( 1 << DDB4 ) |
11
    ( 1 << DDB5 ) |
12
    ( 1 << DDB6 ) |
13
    ( 1 << DDB7 );
14
15
  //Pin 1-8 an PortB auf hi schalten
16
  PORTB &= ~ (
17
    ( 1 << PB0 ) |
18
    ( 1 << PB1 ) |
19
    ( 1 << PB2 ) |
20
    ( 1 << PB3 ) |
21
    ( 1 << PB4 ) |
22
    ( 1 << PB5 ) |
23
    ( 1 << PB6 ) |
24
    ( 1 << PB7 ) );
25
26
    while(1) {
27
    //gogogo
28
    }                      
29
 
30
    return 0;
31
}

von Karl H. (kbuchegg)


Lesenswert?

Probier mal dieses Programm aus
1
#include <avr/io.h>
2
3
int main()
4
{
5
  DDRB = 0xFF;
6
  PORTB = 0x55;
7
8
  while( 1 )
9
    ;
10
}

Damit müsssen auf jeden Fall 4 LED leuchten. Wenn sie das nicht
tun, dann ist wahrscheinlich dein Programm nicht richtig in
den Prozessor gebrannt, oder der ISP-Brenner hält deinen
Prozessor im Reset.
* Überprüf mal, ob das Programm korrekt auf den µC gebrannt wurde
* Zieh mal nach dem Brennen den ISP-Programmer ab.
Wenns dann immer noch nicht geht, dann liegt irgendein anderes
Hardwareproblem vor, das sich von hier aus nicht diagnostizieren
lässt.

von Alex (Gast)


Lesenswert?

Hi,
Wenn ich "verify" mache wird mir folgendes angezeigt:

Reading FLASH input file.. OK
Setting mode and device parameters.. OK!
Entering programming mode.. OK!
Reading FLASH ..      OK!
WARNING: FLASH byte address 0x0000 is 0x00 (should be 0x0C).. FAILED!
Leaving programming mode.. OK!

von STK500-Besitzer (Gast)


Lesenswert?

Hast du den Controller vorher gelöscht?!
Der Haken bei "erase before programming" sollte da sein.

von Alex (Gast)


Lesenswert?

Ja hab ich.

Aber ich frage mich ob denn das Programm an den richtigen Ort 
gespeichert wurde, denn ich habe keine Adresse für den Speicherplatz 
eingegeben.

Alex

von Alex (Gast)


Lesenswert?

Fehler behoben:

Hab meine ISP Frequenz auf 1MHz gestellt. Das war anscheinend zu hoch. 
Hab jetzt 250 kHz.

Alex

von Unbekannter (Gast)


Lesenswert?

Wenn das Programm nicht richtig startet, hilft meistens etwas 
Starterspray.

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.