Älterer Code mit neuerer libc + compiler

Gast #181488
Lesenswert?
• ▲
▼
Hallo,
ich wollte mal ein älteres Programm von mir ein wenig verbessern. Dazu
habe ich als erstes einmal sbi und cbi durch die entsprechenden
port |= (1<<pin) und port &= ~(1<<pin) ersetzen müssen. Nur oh
Schreck-das Programm tut nicht mehr das was es soll :-(
Daraufhin habe ich nochmal neu angefangen, spi und cbi drin gelassen
und stattdessen
inline void sbi(uint8_t port, uint8_t pin) {
port |= (1<<pin);
}

inline void cbi(uint8_t port, uint8_t pin) {
port &= ~(1<<pin);
}
in den Quelltext eingefügt. Das gleiche Resultat. Warnungen gibt es nur
wegen des nicht definiertem F_CPU, aber diese Delay Routinen verwende
ich nicht.
Compiler avr-gcc alt: 3.4.1 neu:3.4.3
Avr-libc         alt: unbekannt neu: 1.2.3
Gibt es sonst noch was zu beachten?
Gast #181490
Lesenswert?
• ▲
▼
Natürlich. die Funktionen sind ja nur als provisorischer Ersatz für die
bishereigen sbi und cbi Befehle gedacht. Da wird der entsprechende Port
übergeben. Außerdem würde ich sonst nicht einen Teil der Ausgabe an den
Ports sehen.
Gast #181493
Lesenswert?
• ▲
▼
> inline void sbi(uint8_t port, uint8_t pin) {


Nunja, "port" wird by value übergeben, also als Kopie. Du veränderst
in der Funktion nur den aktuellen Portzustand als Kopie.
Wenn du es so aufrufst:
sbi(PORTB, 1);

wird PORTB zuerst ausgelesen, dieser ermittelte Wert wird dann im
Parameter port übergeben und verändert. Am Port selbst geschieht nichts
außer dem ersten Lesezugriff.
Gast #181495
Lesenswert?
• ▲
▼
Argh. die Ursache war, dass ich beim Ersetzen eines sbi versehentlich
ein ~ eingefüght hatte. Jetzt gehts wie vorher.
Aus
sbi(LED_PORT,LED_SELECT);
war fälschlicherweise
LED_SELECT_PORT |= ~(1<<LED_SELECT_PIN);
geworden. Richtig wäre aber
LED_SELECT_PORT |= (1<<LED_SELECT_PIN);
gewesen.
Kleine Ursache, große Wirkung und ein halber Tag Zeitaufwand....

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