Forum: Compiler & IDEs Älterer Code mit neuerer libc + compiler


von Malte (Gast)


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?

von Hubert.G (Gast)


Lesenswert?

Ich nehme doch an das du auch angegeben hast welches Port du verwenden
willst?

von Malte (Gast)


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.

von Hubert.G (Gast)


Lesenswert?

http://www.mikrocontroller.net/forum/read-1-150732.html#156854

Hier gibt es eine old_macros.h .  Die habe ich in ein altes Programm
mit eingepackt, funktioniert einwandfrei, mit dem ersetzen bin ich auch
nicht klar gekommen.

von Malte (Gast)


Lesenswert?

Danke, jetzt geht das Programm wieder. Ich werde morgen dann mal
Nachforschungen anstellen woran das nun lag. Sobald ich Ergebnisse habe
werde ich die hier veröffentlichen.

von Chris (Gast)


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.

von Malte (Gast)


Lesenswert?

Stimmt. Da hast du recht. Hätte mir eigentlich auffallen müssen :-O

von Malte (Gast)


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....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.