www.mikrocontroller.net

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


Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich nehme doch an das du auch angegeben hast welches Port du verwenden
willst?

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hubert.G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/forum/read-1-150732...

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.

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Malte (Gast)
Datum:

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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.