Programm startet nicht richtig

Gast #770948
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
#770966
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
Gast #770985
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 "~".
#771008
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.
Gast #771014
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
Gast #771093
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..
Gast #771100
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
}
#771165
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.
Gast #772605
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!

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