mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pin einlesen


Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

ist das der richtige befehl um einen pin der extern belegt wird bei 
einem ATmega64 einzulesen?

sensorwert = (PORTB  & PB3);

für ne Soft-Spi

gruß Bj

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PIN ist Eingang...PORT is Ausgang.

Richtig wäre so:
sensorwert=(PINB & _BV(B3));

Aber vorher bitte das entsprechende DDRB-Bit löschen:
DDRB&=~(_BV(B3));

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Hilfe. aber warum muß ich das bit löschen. der pin wird 
doch von außen gefüttert.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielecht schaust du mal besser in der Dokumentation nach, was das 
DDRB-Register überhaupt macht.

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
verstehe was du meinst. ich mach das immer mit imagecraft und kann mit 
nem application builder die ports/pins bestimmen.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Application Builder"?! Ahhh..ja...

Welcome to the real world :)

Autor: B. Köppel (bekoeppel) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Bj,

guck dir mal das AVR-GCC-Tutorial an, da ist es beschrieben wie das es 
richtig geht: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Gruss
B. Köppel

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wollte mir das ganze als anfänger was leichter machen. ist das erste mal 
das ich mit den dingern arbeite. besser wäre sicher ausführlich aber der 
innere schweinehund wollte nicht.

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe das jetzt so gemacht

SPI sendet ein Byte und empfängt 11 bit (msb first)

void soft_spi_Mastersend (char command2)
{
char n, i;
i = 0;

PORTB = (0 << PB0);                         //ss auf low
for (n = 7; n > 0; n--)
  {
  PORTB = (1 << PB1);               //CLK high
  command2 = command2 >> n;
  PORTB = (command2 <<PB2);
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  PORTB = (0 << PB1);               //CLK low
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  }
}


int soft_spi_Slavesend (void)

{
for(n = 11 ;n > 0 ;n--)
  {
  PORTB = (1 << PB1);               //CLK high
  timer0_init();                    //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);
  PORTD = (0 << PD0);                  //Clk low
  timer0_init();                     //Timer 0 = 3,3mysec (f=150kHz)
  while (!(TIFR & (1<<TOV0)));           //Timerzeit
  TIFR = (1<<TOV0);                //Timerreset
  sensorwert = (PINB & _BV(B3));          //Einlesen der Werte MSB first
  xGes = xGes <<1;
  xGes += sensorwert;
  }
  PORTB = (1 << PB0);                         //ss auf high
  return xGes;
}

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTB = (1 << PB1);               //CLK high
PORTD = (0 << PD0);                  //Clk low

Zweite Zeile sieht etwas unsinnig aus...ausserdem stehen beide CLK-Ports 
in keinem Bezug. Ich vermute mal, das ist so nicht gedacht... ich 
vermute, das sollte PORTD&=~_BV(PD0) heissen...(wenn nicht sogar portb)

Ich nehme an, die DDRB's werden verher schon irgendwo gesetzt?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich vergas: _BV(Bitnummer) ist eine abkürzung für (1<<Bitnummer)

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe das von einer anderen soft spi, die ich an d habe teilweise 
kopiert. Danke fürs aufmerksamme lesen. welche zeile is denn die die 
deiner ansicht nach unsinnig ist?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sagte ich das nicht bereits?

PORTD = (0 << PD0);                  //Clk low

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja das habe ich schon geändert. dachte du meinst aus dem code zeile 
2.klingt der rest für dich schlüssig?

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bisauf die fehlenden DDRBs ....
Ich kenn mich allerdings auch nicht so mit SPI aus.

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
werde das mal testen. danke für die hilfe

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat denn der Code irgendwann irgendwo schonmal gefunzt?

Auf dem zweiten Blick muss ich sagen, das mir
command2 = command2 >> n;
PORTB = (command2 <<PB2);
etwas spanisch vorkommt...

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wollte das gleich mal testen. ich will damit bitweise ein datenwort 
übermitteln.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also command2 soll bit für bit auf PortB2 geführt werden?

So bestimmt nicht!

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da muß ich dir recht geben. das ist schwachsinn. weiß aber auch leider 
net wie es geht

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
senden auch msb first?

uint8_t bitval;

bitval=(command2 & 128);  // msb ausmaskieren
command2 = command2 << 1;
bitval=(bitval >> 5);     // aus Position von PB2 verschieben
if (bitval != 0)
    PORTB|=bitval;
else
    PORTB&=~bitval;



Verstanden?

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja senden auch msb first
die if/else glaube ich zu vertehen. das ist ja wie

if (data & 1){
  PIN_SPI_DATA = 1;
else{
  PIN_SPI_DATA = 0;
}
data = data >> 1;

aber das mit dem ausmaskieren verstehe ich nicht.

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und warum >>5?

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe das jetzt mal so gemacht:


PORTB = (0 << PB0);                         //ss auf low
for (n = 7; n > 0; n--)
  {
  PORTB = (1 << PB1);               //CLK high
  if (command2 & 0x8000)                // Wenn MSB-Bit gesetzt
     {
       PINB = (1<<PINB2);                 // Data-Pin auf 1 schalten,
     }
    else
     {
       PINB = (0<<PINB2)                 // ansonsten auf 0
     }
    command2 = command2 << 1;

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe, da fehlen ein klein wenig die logischen Grundlagen.

Ein Byte besteht aus 8 Bit. (Das war jetzt hoffendlich nicht die grosse 
Neuigkeit). Die 8 Bits in diesem Byte haben unterschiedliche Wertigkeit:
1 2 4 8 16 32 64 und 128
Sind alle 8 Bits in diesem Byte gesetzt kommt man so auf die Summe von 
255 die das Byte dann als Wert hätte.

Wir interessieren uns zunächst aber nur für das höhstwertigste Bit 
(128). Deshalb blenden (maskieren) wir alle anderen Bits aus.

wert=command2 & 128;

War das MSB gesetzt, hat "wert" jetzt den Wert 128. Falls nicht, 0.

Ich habe dieses MSB (ob gesetzt oder nicht) dann einfach auf die 
Position von PB2 (um 5 nach 'unten') um es dann einfach direkt den 
PortBit zuzuweisen. Der Ausdruck dafür wäre aber vermutlich etwas zuviel 
für einen Anfänger gewesen, deshalb hab ichs dann doch mit IF gemacht. 
Etwas blöd...sorry. Tatsächlich kannst du die Zeile mit dem >>5 
weglassen.

command2 = command2 << 1 schubst einfach das Bit6 (64) auf die Stelle 
von Bit7(128), damit beim nächsten schleifendurchlauf damit gearbeitet 
wird.

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (command2 & 0x8000)

urgs...
wenn schon Hexadezimal, dann auch richtig: 128 = 0x80

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch ein fehler von mir. logisch. aber so dämlich wie heute bin ich 
sonst nicht.

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und wieder port und pin vertauscht

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.