Älterer Code mit neuerer libc + compiler

Gast #181488
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
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
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.
Gast
> 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
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

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.