Forum: Mikrocontroller und Digitale Elektronik Problem mit ATtiny10


von Lucky Luke (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

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?

von Lucky Luke (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Lucky Luke (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.