Hallo Leute,
ich hab da ein Problem -.-
Ich muss morgen in der Schule ein AVR-Projekt abgeben.
Ich habe grade in der Software was geändert, und mir dabei den Mega1284p
Verfust :-(
Ich habe keinen Oszillator hier!
Nur einen Tiny 13...
Kann ich mir damit einen Oszillator bauen?
Sollte doch gehen... ich muss doch nur einen Pin schnell von Low auf
High umschalten...
LG
Ich bekomm es nicht Compiliert -.-
Die Fehlermeldung habe ich...
avr-gcc -mmcu=attiny13 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Takt.o -MF
dep/Takt.o.d -c ../Takt.c
../Takt.c: In function 'main':
../Takt.c:10: error: 'toggle' undeclared (first use in this function)
../Takt.c:10: error: (Each undeclared identifier is reported only once
../Takt.c:10: error: for each function it appears in.)
../Takt.c:10: error: expected ';' before 'PIN'
make: *** [Takt.o] Error 1
Build failed with 4 errors and 0 warnings...
Mein Code:
#include <avr/io.h>
int main (void) {
DDRB = 0xff;
PORTB = 0xff;
while(1)
{
toggle PIN b1
}
return 0;
}
Was mache ich Falsch?
Dennis schrieb:> Was mache ich Falsch?
Du beschäftigst Dich mit Mikrocontrollern, und wie man sieht liegt das
Dir nicht. :D
Es gibt kein Toggle unter C, damit wollte der Vorposter nur anregen die
übliche C-Syntax zum Toggeln eines Pins zu verwenden.
Harald schrieb:> Ich würde nach dem>> PORTB ^= (1<<PB0); //wechselt PB0>> noch nen NOP rein machen. Ist sicherer.
Hä?
Kannst Du mal erläutern, warum?
Peter
Eine Lösung in Assembler:
.equ pinb = 0x16 ;erspart das include-file
.equ ddrb = 0x17
init:
sbi ddrb,0 ;portb,0 zum Ausgang machen
loop:
sbi pinb,0 ;pinb,0 mit 1 beschreiben führt beim atiny zum toggeln.
rjmp loop
Das ergibt bei der default-Taktfrequenz von ca 1 MHZ eine togglefrequenz
von 250 kHz, die ISP-Frequenz muss also niedriger als 60,.. kHz
eingestellt werden.
Hi
Toggling the Pin:
>> sbi pinb,0 ;pinb,0 mit 1 beschreiben führt beim atiny zum toggeln.>hääää?
Ja damit hat er recht.
Writing a logic one to PINxn toggles the value of PORTxn, independent
on the value of
DDRxn. Note that the SBI instruction can be used to toggle one single
bit in a port.
MfG Spess
@Peter Dannegger
Es soll doch ein sauberer Takt werden, oder? Da sollte man wenn man in
dem Programm schon nichts anderes tut, dem Zustand des Pins wenigstens
die gelgenheit geben, ordentlich einzuschwingen. Geht aber auch ohne
nop.
Das Ausführen des nop dauert einen Takt. Damit kann man in einer
Programmschleife die Dauer der Schleife verlängern.
Eine andere Funktion war früher, in EPROM's code zu "löschen". Denn wenn
man den Code mit nop's überschrieb, konnte man ihn damit unwirksam
machen, ohne das gesamte Programm zu löschen.
Bei EPROM's kann man ja nachträglich bits zwar auf 0 bringen, nicht aber
wieder auf 1, das geht nur durch Gesamtlöschen.
Und für nop ist "zufällig" der code 0x00 gewählt worden.
Harald schrieb:> @Peter Dannegger>> Es soll doch ein sauberer Takt werden, oder? Da sollte man wenn man in> dem Programm schon nichts anderes tut, dem Zustand des Pins wenigstens> die gelgenheit geben, ordentlich einzuschwingen. Geht aber auch ohne> nop.
Wenn dazu ein NOP nötig wäre, dann wäre der AVR Schrott.
Der MC-Hersteller garantiert Dir, daß die Outputs selbst bei maximaler
CPU-Geschwindigkeit sauber schalten.
Ohne NOP dauert eine Periode mit diesem Programm ja schon 10 Zyklen.
Du kannst aber auch ne PWM programmieren, ergibt 2 Zyklen, das ist immer
noch sauber.
Du kannst sogar die Clock-Out Fuse setzen, ergibt dann F_out = F_CPU und
ist auch sauber.
Vergiß also das mit dem NOP ganz schnell, das ist Quatsch.
Ein NOP braucht man nur dann, wenn man den gleichen Pin sofort wieder
einlesen will, z.B. beim Qtouch.
Beim AVR werden die Eingänge im vorherigen CPU-Takt gelatcht. Ohne NOP
liest man also den Pinzustand von vor dem Setzen.
Peter
Schraub du mal deine Empfindlichkeit ein bisschen runter. Peter hat nun
mal Recht, ein "NOP" ist an dieser Stelle völlig überflüssig. Also
Quatsch, Blödsinn, Unfug, fehl am Platze usw. usw. ;)