mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tiny13 als Taktgenerator für Verfuste Controller


Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: DER TOGGLER (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
while (1)
{
 toggle PINbeliebig
}

schon hast du nen Takt

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: MWS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das da :

toggle PIN b1

Autor: g457 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
> ../Takt.c:10: error: 'toggle' undeclared (first use in this function)

∗hüstel∗

Ich bin mal so frei und häng was in den Anhang..

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dennis schrieb:
> Was mache ich Falsch?

steht doch dran. Er kennt toggle nicht.

Also ich würds so machen:
while(1)
{
  PORTB ^= (1<<PB0); //wechselt PB0
}

^= heißt exklusiv oder, siehe Bitmanipulation.
:-)

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry leute ich bin erst seit ca 1 monat dabei :-D

Trotzdem vielen dank :-)

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde nach dem

PORTB ^= (1<<PB0); //wechselt PB0

noch nen NOP rein machen. Ist sicherer.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: LED (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> sbi pinb,0    ;pinb,0 mit 1 beschreiben führt beim atiny zum toggeln.
hääää?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: LED (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Spess!
Wieder was dazugelernt :-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Wieder was dazugelernt :-)

Aber Vorsicht. Gilt nicht für alle AVRs. Also erst im Datenblatt 
nachsehen.

MfG Spess

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, für den atmega8 gilt das nicht, da brauchts ziemliches Gestrampel, 
einen einzelnen pin zu toggeln.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was bedeutet eigentlich dieses "nop" in Assembler, wozu braucht man das?

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
NOP = no operation, das sagt doch alles

Autor: Peter R. (pnu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Vergiß also das mit dem NOP ganz schnell, das ist Quatsch.
Vergreif Dich mal nicht im Ton mein lieber.

Autor: Marek (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.