Programm startet nicht richtig

Gast #770948
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
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
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
@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
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
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
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
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
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!
Gast #772652
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.