www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Lauflicht im ATmega8


Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe da einen Konflikt mit meinem ATmega8.
Also ich habe folgenden Code:
#include <avr/io.h>
#include <util/delay.h>

int main()
{
  DDRB = 0xFF;
  PORTB = 0xFF;
  while (1)
  {
  if(PORTB==0xFF)
    PORTB=0xFE;
  else
    PORTB=PORTB*2+1;
  _delay_ms(100);
  }
  return 0;
}
Alle LEDs aus mit 0xFF = 0b11111111 = 255
Wenn PORTB jetzt 0xFF ist, was er ja anfangs ist wird er 0xFE gesetzt = 
254 = 0b11111110
Es leuchtet LED0.
Dann wird PORTB x 2 also 254 x 2 = 508 + 1 = 509 = 1FD
Wenn jetzt nur 2 Hexadezimale stellen verarbeitet werden können wird die 
1 nicht beachtet und es ergibt sich 0xFD = 253 = 0b11111101
LED1 leuchtet. Es ergibt sich ein lauflicht...

Ändere ich den Code so das das Licht andersrum laufen soll:
#include <avr/io.h>
#include <util/delay.h>

int main()
{
  int a;
  DDRB = 0xFF;
  PORTB = 0xFF;
  while (1)
  {
  if(PORTB==0x01)
    PORTB=0xFF;
  else
    PORTB=(PORTB-1)/2;
  _delay_ms(100);
  }
  return 0;
}
PORTB ist 0xFF wird also -1 und dann /2 gerechnet: 255 - 1 = 254 / 2 = 
127 = 0x7F = 0x01111111
Es sollte LED7 leuchten.
127 - 1 = 126 / 2 = 63 = 3F = 0x00111111
Es sollten LED7 und LED6 leuchten.

Allerdings leuft kein Licht. Hab ich irgendwo einen denkfehler? Helft 
mir bitte auf die Sprünge.

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

Bewertung
0 lesenswert
nicht lesenswert
WeißNichtWeiter schrieb:

> Allerdings leuft kein Licht. Hab ich irgendwo einen denkfehler? Helft
> mir bitte auf die Sprünge.

Der Simulator sagt auch, dass das laufen müsste.

Ob es wohl damit zusammen hängt, dass PB6 und PB7 als Spezialfunktion 
die XTAL Pins sind, über die ein Quarz an den Mega8 angeflanscht wird.

Wechsle mal auf den PORT D
Dort hast du auch noch einen vollständigen 8 Bit Port


Übrigens:
In deiner Applikation willst du Bits schieben.
An dieser Stelle solltest du dann auch die C eigenen Schiebeoperationen 
benutzen und nicht mit * und / rumhampeln.

  b =  a << 1;
b erhält den Wert, den man bekommt wenn a bitmässig um 1 Stelle nach 
links geschoben wird.

  b =  a >> 1;
b erhält den Wert, den man bekommt wenn a bitmässig um 1 Stelle nach 
rechts geschoben wird.

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok mit Schiebeoperatoren klappts. Auch auf PORTB.
Danke

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WeißNichtWeiter schrieb:
> Ok mit Schiebeoperatoren klappts. Auch auf PORTB.

Weisst Du auch warum?

Deswegen:
PORTB=(PORTB-1)/2;

(PORTB-1) könnte negativ werden, also wird eine vorzeichenbehaftete 
Division durchgeführt. Da eine vorzeichenbehaftete Division durch 2 
nicht identisch ist mit dem Schieben nach rechts (denn das 
Vorzeichen-Bit muss dabei erhalten bleiben), geht das voll in die Hose.

Gruß,

Frank

Autor: WeißNichtWeiter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso so hab ich das noch garnicht gesehen, klingt aber logisch...
Danke für die nachträgliche Aufklärung ;)

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.