Forum: Mikrocontroller und Digitale Elektronik Attiny13 nach ein paar Zeile Code voll?


von Jürgen (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

wie kann es sein das wegen so wenig Code der Speicher so überfüllt ist?

Es handelt sich um einen Attiny13, getaktet mit dem internen 4,8 Mhz 
RC-Glied.
Das AVR-Studio gibt die Meldung im Anhang aus.

Danke für die Hilfe.

von Kai S. (Gast)


Lesenswert?

Hast du mit Optimierung kompiliert?

von Jürgen (Gast)


Lesenswert?

Danke für die schnelle Antwort.
Hattest recht. Die habe ich vergessen. Jetzt hat er nur noch 13,5%.
(Finds drotzem noch viel für so wenig Code. Aber egal.)

Allerdings läuft es nicht so wie ich will.
Ich möchte an dem Ausgabe-Pin ein Signal für eine IR-Diode ausgeben.

Dieses Signal soll so aussehen:

500ms 38 kHz ausgeben.
500ms nichts ausgeben.
Und das selbe von Vorn.

Momentan macht Er was Er will. Mal gibt Er 38kHz aus. Dann für ne kurze 
Zeit 0V oder 5V. Wild durcheinander.

Was mach ich falsch?

von Christian H. (christian_h)


Lesenswert?

Normal ist es definitiv nicht. Compileroptionen überprüfen, und 
gegebenfalls von der .elf mal ein avr-dump machen und dort reinschauen, 
wieso das so groß ist.

von R. F. (rfr)


Lesenswert?

Dein Interruptkonzept scheint nicht zu funktionieren.
Gruss
Robert

von Oliver J. (skriptkiddy)


Lesenswert?

Du trennst mit dem löschen von CS0 blos den Timer von Takt ab. Der Timer 
hat aber immer noch Kontrolle über den Port-Pin. Die müsstest du ihm 
noch entziehen über die COM0A-Flags. Dann kannst du dem Port manuell den 
Zustand zuweisen, den du willst.

Gruß Skriptkiddy

von Sam .. (sam1994)


Lesenswert?

Versuchs mal mit dem:
1
_delay_ms(500);
2
TCCR0A |= (1<<COM0A0);
3
_delay_ms(500);
4
TCCR0A &= ~(1<<COM0A0);
5
PORTB &= (1<<OC0A);

von Oliver J. (skriptkiddy)


Lesenswert?

Samuel K. schrieb:
> PORTB &= (1<<OC0A);
Bringt was?

von Sam .. (sam1994)


Lesenswert?

Skript Kiddy schrieb:
> Bringt was?

Stimmt, lass das weg. Der Pin wird automatisch gelöscht, da er wieder 
mit dem PORTB Register verbunden ist.


Eleganter wäre es im Comp. Int. eine Variable hochzuzählen und im Int. 
PWM auszuschalten (und später wieder ein).

von Oliver J. (skriptkiddy)


Lesenswert?

1
If one or both of the COM0A1:0 bits are set, the OC0A output overrides the
2
normal port functionality of the I/O pin it is connected to.

von Sam .. (sam1994)


Lesenswert?

Seltsam, bei vielen anderen Registern ist das nicht so.

Warum fragst du dann überhaupt was es bringt?

von Matthias L. (Gast)


Lesenswert?

>ein Signal für eine IR-Diode ausgeben.
>38 kHz ausgeben.

Willst Du ne Fernbedienung bauen?

von Sam .. (sam1994)


Lesenswert?

Matthias Lipinsky schrieb:
>>ein Signal für eine IR-Diode ausgeben.
>>38 kHz ausgeben.
>
> Willst Du ne Fernbedienung bauen?

Schau mal wie der Quellcode heißt.

von Oliver J. (skriptkiddy)


Lesenswert?

Samuel K. schrieb:
> Seltsam, bei vielen anderen Registern ist das nicht so.
>
> Warum fragst du dann überhaupt was es bringt?

Schau dir den Code mal an. Das ist sicher nicht das was du wolltest. 
Meinstest du zufällig

PORTB &= ~(1<<OC0A); ?

Gruß Skriptkiddy

von spess53 (Gast)


Lesenswert?

Hi

Eine andere Möglichkeit wäre, die Frequenz mit Fast PWM (Mode7) zu 
erzeugen. Dann lässt sich durch Setzen des FOC0B-Bits ein definierter 
Pegel einstellen.

MfG Spess

von Sam .. (sam1994)


Lesenswert?

Ja du hast ja recht.

Zu viel Copy&Paste.

von Simon K. (simon) Benutzerseite


Lesenswert?

Christian H. schrieb:
> Normal ist es definitiv nicht.

Das ist völligst normal. Eventuell sollte man bei Gelegenheit auch mal 
in das Handbuch der avr-libc reinschauen.
Es gibt sogar eine Warnung, wenn man die _delay_xyz Funktionen ohne 
Optimierung benutzt. Einfach mal die Augen aufmachen.

Hintergrund ist, dass ohne Optimierung die float-lib nicht rausoptimiert 
wird. Und die ist eben riesig verglichen mit der Flashgröße eines 
Tiny13.

von Max (Gast)


Lesenswert?

Mit C auf nen tiny13 rumzubügeln is auch heftig, da kostet ja der 
startup schon fast 10% ...
Assembler is da viel besser und mit < 512 Befehlen is der Assemblercode 
auch übersichtlich....

von Oliver J. (skriptkiddy)


Lesenswert?

Max schrieb:
> Mit C auf nen tiny13 rumzubügeln is auch heftig, da kostet ja der
> startup schon fast 10% ...

Da kann man Abhilfe schaffen:
1
// From Peter Fluery AVRFreaks Aug 10 2005 - to remove interrupt Vector table
2
// put -nostartfiles in LDFlags, add the following function saves wasted space
3
void __jumpMain (void) __attribute__ ((naked)) __attribute__ ((section (".init9")));
4
5
void __jumpMain(void)
6
{   
7
    asm volatile ( ".set __stack, %0" :: "i" (RAMEND) );
8
    asm volatile ( "clr __zero_reg__" );        // r1 set to 0
9
    asm volatile ( "rjmp main");                   // jump to main()
10
} 
11
12
13
int main(void) 
14
{ 
15
       /* ... */
16
}
Quelle: www.tfelectronics.com.au/bin/SmileyBoot.c

Gruß Skriptkiddy

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich würds sein lassen. Dadurch verliert man auch alle Initialisierungen 
von globalen Variablen beispielsweise.

Wenn man meint selbst klüger zu sein als der Compiler, kann man das 
immer noch machen, wenn man zu wenig Platz hat.

von Oliver J. (skriptkiddy)


Lesenswert?

Simon K. schrieb:
> Dadurch verliert man auch alle Initialisierungen
> von globalen Variablen beispielsweise.
Wollte ich grad noch dranhängen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Simon K. schrieb:
> Ich würds sein lassen. Dadurch verliert man auch alle Initialisierungen
> von globalen Variablen beispielsweise.

Die werden sogar initialisiert weil gegen  __do_clear_bss 
und __do_copy_data gelinkt wird und so der init-Code aus der libgcc 
gezogen wird.

.bss wird allerdings zu Schrott initialisiert weil R1 sinnigerweise erst 
nach dem init-Code per Hand auf 0 gesetzt wird: Nach Power-Down haben 
AVR-GPRs mehr oder weniger "zufällige" Werte.

Ausserdem fehlt der Code zum Initialisieren des SP. Das .set da oben hat 
nur rein psychologische Funktion...

Wie oben steht ist's Hack und auch noch falsch...

von Jürgen (Gast)


Lesenswert?

Danke, es funktioniert.
So hats funktioniert:

Samuel K. schrieb:
> _delay_ms(500);
> TCCR0A |= (1<<COM0A0);
> _delay_ms(500);
> TCCR0A &= ~(1<<COM0A0);

Samuel K. schrieb:
>> Willst Du ne Fernbedienung bauen?
>
> Schau mal wie der Quellcode heißt.

Richtig, es soll eine Einparkhilfe geben.

Nochmals danke.
Auf euch ist wie immer verlass.

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.