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?
Ich nehme doch an das du auch angegeben hast welches Port du verwenden willst?
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.
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.
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.
> 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.
Stimmt. Da hast du recht. Hätte mir eigentlich auffallen müssen :-O
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.