www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programm startet nicht richtig


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
 
int main (void) {
   //Pin 1-8 an PortB als Ausgäne definieren
  DDRB = 
    ( 1 << DDB0 ) |
    ( 1 << DDB1 ) |
    ( 1 << DDB2 ) |
    ( 1 << DDB3 ) |
    ( 1 << DDB4 ) |
    ( 1 << DDB5 ) |
    ( 1 << DDB6 ) |
    ( 1 << DDB7 );

  //Pin 1-8 an PortB auf hi schalten
  PORTB |= 
    ( 1 << PB0 ) |
    ( 1 << PB1 ) |
    ( 1 << PB2 ) |
    ( 1 << PB3 ) |
    ( 1 << PB4 ) |
    ( 1 << PB5 ) |
    ( 1 << PB6 ) |
    ( 1 << PB7 );

    while(1) {
    //gogogo
    }                      
 
    return 0;
}

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

Grüße Alex

Autor: David Madl (md2k7)
Datum:

Bewertung
0 lesenswert
nicht 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:
  PORTB &= 
    ~( 1 << PB0 ) &
    ~( 1 << PB1 ) &
    ~( 1 << PB2 ) &
    ~( 1 << PB3 ) &
    ~( 1 << PB4 ) &
    ~( 1 << PB5 ) &
    ~( 1 << PB6 ) &
    ~( 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

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
  PORTB &= 
    ~( 1 << PB0 ) &
    ~( 1 << PB1 ) &
    ~( 1 << PB2 ) &
    ~( 1 << PB3 ) &
    ~( 1 << PB4 ) &
    ~( 1 << PB5 ) &
    ~( 1 << PB6 ) &
    ~( 1 << PB7 );

Ich halte diese Schreibweise für vorteilhafter:
  PORTB = 
    ( 0 << PB0 ) |
    ( 0 << PB1 ) |
    ( 0 << PB2 ) |
    ( 0 << PB3 ) |
    ( 0 << PB4 ) |
    ( 0 << PB5 ) |
    ( 0 << PB6 ) |
    ( 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 "~".

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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:
//Bits setzen:
PORTx |= (1 << BIT1) | (1 << BIT2); //...usw.

//Bits löschen:
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.

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFM

Die Glaskugel von AVRFan hat recht.
#include <avr/io.h>
 
int main (void) {
   //Pin 1-8 an PortB als Ausgäne definieren
  DDRB = 0xff;
  //Pin 1-8 an PortB auf low schalten
  PORTB = 0; // kann man sich hier auch schenken, noch Nuller als Null gehts nicht

    while(1) {
    //gogogo
    }                      
 
    return 0;
}

sollte funktionieren.

Oliver

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt so versucht funktioniert immer noch ned :-/
#include <avr/io.h>
 
int main (void) {
   //Pin 1-8 an PortB als Ausgäne definieren
  DDRB = 
    ( 1 << DDB0 ) |
    ( 1 << DDB1 ) |
    ( 1 << DDB2 ) |
    ( 1 << DDB3 ) |
    ( 1 << DDB4 ) |
    ( 1 << DDB5 ) |
    ( 1 << DDB6 ) |
    ( 1 << DDB7 );

  //Pin 1-8 an PortB auf hi schalten
  PORTB |= 
    ( 0 << PB0 ) |
    ( 0 << PB1 ) |
    ( 0 << PB2 ) |
    ( 0 << PB3 ) |
    ( 0 << PB4 ) |
    ( 0 << PB5 ) |
    ( 0 << PB6 ) |
    ( 0 << PB7 );

    while(1) {
    //gogogo
    }                      
 
    return 0;
}

Grüße..

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahh Sorry so hab ichs jetzt, geht aber immer noch ned:
#include <avr/io.h>
 
int main (void) {
   //Pin 1-8 an PortB als Ausgäne definieren
  DDRB = 
    ( 1 << DDB0 ) |
    ( 1 << DDB1 ) |
    ( 1 << DDB2 ) |
    ( 1 << DDB3 ) |
    ( 1 << DDB4 ) |
    ( 1 << DDB5 ) |
    ( 1 << DDB6 ) |
    ( 1 << DDB7 );

  //Pin 1-8 an PortB auf hi schalten
  PORTB &= ~ (
    ( 1 << PB0 ) |
    ( 1 << PB1 ) |
    ( 1 << PB2 ) |
    ( 1 << PB3 ) |
    ( 1 << PB4 ) |
    ( 1 << PB5 ) |
    ( 1 << PB6 ) |
    ( 1 << PB7 ) );

    while(1) {
    //gogogo
    }                      
 
    return 0;
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier mal dieses Programm aus
#include <avr/io.h>

int main()
{
  DDRB = 0xFF;
  PORTB = 0x55;

  while( 1 )
    ;
}

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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: STK500-Besitzer (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fehler behoben:

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

Alex

Autor: Unbekannter (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.