PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieberegister aktualisiert sich nicht



AVR-Neuling
12.05.2014, 20:24
Hallo Community,

ich bin neu hier und erst seit einigen Wochen in die AVR-Programmierung in C eingestiegen. Aus diesem Grund ist das alles ziemlich neu für mich. Seit bitte nicht zu hart mit mir wenn ich in sämtliche Fettnäpchen trete ;-)

Ich versuche mich zur Zeit an einem Schieberegister Baustein

http://www.produktinfo.conrad.com/datenblaetter/150000-174999/155762-da-01-en-LOGIK_IC_M74HC595B1R_STM.pdf

mit einem ATmega8 anzusteuern. Hier der Code:


while(1)
{

uint8_t Wert;


PORTD |= (1<<PORT_SCLR);
for (int i = 8; i > 0; i--)
{
PORTD &=~ (1<<PORT_SER);
if (Wert & 0x80)
{
PORTD |= (1<<PORT_SER);
}

Wert <<= 1;

PORTD &=~ (1<<PORT_SCK);
PORTD |= (1<<PORT_SCK);
}
PORTD &=~ (1<<PORT_RCK);
PORTD |= (1<<PORT_RCK);

PORTD &=~ (1<<PORT_SCLR);

Was mir an dem Ganzen zur Zeit ein wenig unklar ist:

1. Wenn ich uint8_t Wert; vor der while-Schleife anlege, erkennt der Baustein die Variable Wert nicht und tut nichts, warum???

2. Wie kann ich die Variable Wert verändern??? Wenn ich nach diesem Programmcode ein Wert++; hinzufüge, bleibt die Variable bei ihrem vordefinierten Wert und ändert sich nicht!!!

Vielen Dank im Voraus !!!

askazo
13.05.2014, 13:56
Hi,

mir fallen 2 Sachen auf:
- Du hast die Variable Wert nicht initialisiert. Das sollte z.B. so aussehen:

uint8_t Wert = 0
Dies sollte auch außerhalb der while-Schleife stehen.
- Du hast keine Pause zwischen dem Setzen und dem Rücksetzen eines Ports. Das scheint den Compiler dazu veranlassen, den ersten der beiden Befehle wegzuoptimieren (Ich hab's mal im AVR-Simulator nachgestellt, dort war es so).
Am einfachsten setzt Du hier folgende Zeile zwischen die beiden Befehle.


asm volatile("nop");

Dies veranlasst den Compiler, zwischen den Beiden Port-Operationen einen NOP-Befehl (no Operation) einzufügen, was einem Takt warten entspricht. Im Simulator hat dies so funktioniert.

Gruß,
askazo