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.
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?
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.
Dein Interruptkonzept scheint nicht zu funktionieren. Gruss Robert
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
Versuchs mal mit dem:
1 | _delay_ms(500); |
2 | TCCR0A |= (1<<COM0A0); |
3 | _delay_ms(500); |
4 | TCCR0A &= ~(1<<COM0A0); |
5 | PORTB &= (1<<OC0A); |
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).
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. |
Seltsam, bei vielen anderen Registern ist das nicht so. Warum fragst du dann überhaupt was es bringt?
>ein Signal für eine IR-Diode ausgeben. >38 kHz ausgeben. Willst Du ne Fernbedienung bauen?
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.
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
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
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.
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....
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
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.
Simon K. schrieb: > Dadurch verliert man auch alle Initialisierungen > von globalen Variablen beispielsweise. Wollte ich grad noch dranhängen.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.