Hallo, ich mache meine ersten Versuche mit einem ATtiny10 und habe ein kleines Problem bei dem ich nicht weiter komme. Hier mein Code: #include <avr/io.h> #include <util/delay.h> #include <stdint.h> // Declare your global variables here uint8_t i; int main(void) { DDRB=0xf; i=0x1; while (1) { PORTB |=0x1; _delay_ms(1000); PORTB &=0xe; _delay_ms(1000); i=i+1; // i=10; if (i>=0x8) { i=0x0; PORTB |=0x2; } } } Jetzt zu meinem Problem, das kleine Programm funktioniert soweit bis auf die Zeile i=i+1 ! Der Kerl will mir die Variable i nicht hoch zählen, wenn ich die Variable i z.B. auf 10 setze springt das Programm in die if-Anweisung und setzt das Bit in PORTB !? Hat jemand eine Idee woran das liegen kann ? Danke ! Gruß Luke
Ich könnte mir vorstellen dass der SRAM von 32 Bytes etwas zu knapp ist, insb. durch die Verwendung von _delay_ms. Versuch mal einfach eine while(i--); schleife zum warten zu nehmen. Optimierungen sind an?! Die kleinen Tinys sind halt nicht so für die Programmierung mit C gedacht. Und gewöhne dir mal eine andere Schreibweise an:
1 | PORTB |= (1<<PB0); |
2 | _delay_ms(1000); |
3 | PORTB &= ~(1<<PB0); |
ist doch lesbarer als:
1 | PORTB |=0x1; |
2 | _delay_ms(1000); |
3 | PORTB &=0xe; |
oder nicht?
Hallo Timmo! Du hast wohl recht, ich habe die Delay-Anweisungen rausgeworfen und jetzt zählt er auch meine Variable hoch. Werde mich mal mit Assembler versuchen, ist bei den kleinen Speichern die bessere Wahl. Gruß Luke
Timmo H. schrieb: > Ich könnte mir vorstellen dass der SRAM von 32 Bytes etwas zu knapp ist, > insb. durch die Verwendung von _delay_ms. Das delay ist nicht das Problem, alle Werte dazu werden in den Registern gehalten, -Os. Die Toolchain erzeugt jedoch, zumindest mit AVR-Studio 5.1.208, immer noch falsche Opcodes für LDS/STS. Der Tiny10 benötigt 'ne Sonderform LDS/STS 16-bit, also 1-Word Befehle, es werden jedoch nur die normalen LDS/STS 2-Word Befehle erzeugt, also für diesen Typ ungültige Opcodes. Kuckst Du hier: Beitrag "ATtiny10 mit avr-gcc Compiler" Lucky Luke schrieb: > Du hast wohl recht, ich habe die Delay-Anweisungen rausgeworfen und > jetzt zählt er auch meine Variable hoch Das mag ich jetzt nicht so recht glauben, läuft vielleicht im Simulator, aber nicht auf HW. Dein Code würde übrigens funktionieren, wenn Du die Variable i lokal zur main machst (-Os), dann bleibt die in 'nem Prozessorregister und es gibt keine Schwierigkeiten. Sobald auf's SRam zugegriffen wird, sind die Probleme aber wieder da. Wenn's da keinen Fix dafür gibt, dann ist der AVR GCC hier einfach unbrauchbar. Nimm den AVR Assembler, der macht's richtig.
Hallo, habe meine ersten Gehversuche mit dem ATtiny10 abgeschlossen, mit C ist hier nix zu machen, ständig Konflikte die gelöst werden müssen bzw. funktioniert überhaupt nicht TIMER0 usw. Mit Assembler ist man hier wirklich besser beraten und kommt auch schnell und Speichereffizient an Ziel ! Vielen Dank für Eure Hilfe ! Gruß Luke
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.