Kani-Coaching (C lernen mit Nomis)

Hi Kani,

sieht noch nicht so fehlerfrei aus ...

Also ... Aufbau eines Programms ...

=== Initialisierung ===
1. Stackpointer (für unterprogrammaufrufe und Daten retten initialisieren)
2. Ports die man verwenden will initialisieren (Eingang, Ausgang, Pullups, ...)
3. USART, Timer, ADC, ... initialisieren
4. Interruptmasken, Interruptbits initialisieren
5. externe Hardware initialisieren (LCDs, I2C-Bausteine, ...)
6. JETZT erst die Interrupts Einschalten

=== Hauptroutine ===
7. Start der Hauptroutine
- In der Hauptroutine wird alles mögliche gemacht usw ...
while(1) { ... ... ... ... }

=== Unterprogramme/SUBs ===
8. Hinter der Hauptroutine stehen die Unterprogramme/Subroutinen/ISRs
die entweder von Teilen der Hauptroutine aufgerufen werden oder von
Interrupt-Ereignissen angesprungen werden oder die bei der Initialisierung
angesprungen werden.

- - - - - - - - - - - - -
Du hast deine ISR mitten in die Hauptroutine geschrieben. Die ISRs sind aber
absolut UNABHÄNGIG von deinem gesamten anderen Programm. Die schweben
sozusagen über deinem anderen Programm.

Es ist nicht einfach ein Programm mit Interrupt-Bearbeitung zu schreiben ;)

Gruß
Dino
 
Hat einer von euch vllt. noch eine sinnvolle Aufgabe für mich?
 
Hat einer von euch vllt. noch eine sinnvolle Aufgabe für mich?
Wie war das mit RS232 ? Hat einer deiner PCs ne serielle Schnittstelle (COM1/2)?
Dann würde ich ne Konfiguration von dem USART empfehlen. Nen MAX232 an
den Mega dransetzen und das Teil mit dem PC verbinden. Dann hat man einen
direkten Datenaustausch der einfach zu programmieren ist. Das hab ich bei
meinen Megas auch gemacht und es ist sinnvoll :D
- Diagnosedaten zum PC senden
- Konfigurationsdaten zum Mega senden
- Sensoren am Mega abfragen
- LEDs am Mega ansteuern
- ... usw

MAX232 mit 4 Elkos und nen 9pol Sub-D (weiblich) und nen Stück Kabel das
bis zum PC reicht (3adrig) und der Rest ist Programm ;)

Das kann man zuerst ohne Interrupts programmieren und dann auch auf
Interrupt-Betrieb erweitern. Also alles drin was das Herz begehrt :D

Gruß
Dino
 
Cool das wäre was.
Ich habe nen PC mit Com-Port. Aber es gibt doch diese RS232 to USB Adapter. Mach das lieber mit'm Notebook.
Dann brauche ich soein Programm, dass einen virtuellen Comport aus dem USB-Port macht. Das sollte kein Problem sein.
Also schreibe ich das mal mit auf meine Bestellliste. Ich wollte noch diverse Sensoren bestellen.
Also Hitze, Feuchtigkeit usw. Was gibt es da für welche?
 
Hi Kani,

Ich habe nen PC mit Com-Port. Aber es gibt doch diese RS232 to USB Adapter. Mach das lieber mit'm Notebook.
Dann ist die Hardware vorhanden ;)

Dann brauche ich soein Programm, dass einen virtuellen Comport aus dem USB-Port macht. Das sollte kein Problem sein.
Das ist es auch nicht, weil dir das entweder XP selber oder der Treiber
des USB-RS232-Adapters (also der Treiber für die COM-Kabelpeitsche)
macht.

Also schreibe ich das mal mit auf meine Bestellliste. Ich wollte noch diverse Sensoren bestellen.
Also Hitze, Feuchtigkeit usw. Was gibt es da für welche?
Da gibts alles mögliche. Aber Feuchtigkeit und Druck liegen zB jenseits
von 10..15,-eur pro Stück ! Also ein hohes finanzielles Risiko wenn es
nicht klappt. Und das sind dann welche wo noch die Anpaß-Schaltung für
den ATmega fehlt. Die Digitalen liegen nach Infos die ich hier gelesen
habe so ab 20..25,-eur aufwärts. Noch größeres Risiko.

Also fang besser mit Temperatur (NTC,PTC,DS18S20),
Helligkeit (LDR,Fototransistor), ... an. die liegen im 1..2,-eur Bereich plus
ein paar Widerstände. Kleineres finanzielles Risiko wenn es schief geht

Für die Serielle brauchst Du folgendes ...
- MAX232CPE
- 4 Elkos mit jeweils 4,7uF / 16..25V
- nen Stück 3adriges Kabel das bis zum PC reicht (oder Einzellitzen)
- ne 9polige Sub-D-Kupplung (weiblich mit Löchern) die an das Kabel kommt
- wenn Du sehen willst, das da auch Daten fließen, noch 2 rote LEDs
(sieht man besser) und 2Stk 2,2k Vorwiderstände für die LEDs.
Der Kram für die RS232 sollte so um die 4..6,-eur kosten (pi mal Daumen)

Schaltplan vom MAX232 kann ich dir dann machen. Ist dann einfacher ;)

RS232_1.jpg RS232_2.jpg
Mal als Beispiel. Einmal mit Elkos und einmal mit Tantal-Perlen.
So klein ist der Schnittstellentreiber mit MAX232. Das sollte
problemlos hinzubruzzeln sein :D Der linke ist von meinem ATmega32-Board
und der rechte von meinem Analyzer mit ATmega168.

Gruß
Dino
 
Hi Dino,

der (mein) MAX232CPE kommt auch mit 1µ Elkos auch. Rennt prima.


Grüsse,

Michael
 
stimmt

Dito:
1 Mikrofarad reichen völlig.
Bild folgt. Attiny2313-ADC mit serieller Schnittstelle

Gruß Oskar01
 
Hallo zusammen,

der (mein) MAX232CPE kommt auch mit 1µ Elkos auch. Rennt prima.

Dito:
1 Mikrofarad reichen völlig.
Bild folgt. Attiny2313-ADC mit serieller Schnittstelle

ich weiß schon. Manche von den Typen arbeiten sogar mit 0,1uF aber ich wußte zu
dem Zeitpunkt nicht genau welche Endung welche Kondensatorgröße benötigt.
Und vom MAX232 gibt das so 4-7 verschiedene (glaube ich so) mit verschiedenen
Preisen. Und mit 4,7uF müßten absolut alle wirklich einwandfrei laufen. Die älteren
Typen brauchten glaube ich so um die 4,7uF für die Ladungspumpe, wenn mich mein
Gedächtnis nicht trügt.

Gruß
Dino

Gruß
Dino
 
So da ich heute Abend bestellen wollte mal kurz ein paar Fragen:

Ich bestelle bei Pollin und bei Reichelt. Bei Pollin gibt's ja leider nicht alles.
Also es werden bestellt:
Ein Paar Taster, dieser Adapter ist der richtige oder?
Dann noch das Display mit den zwei Controllern + 20 1mf Elko oder welche?
Mal sehen, was ich noch so finde. Ich bin am überlegen, ob ich mir noch ein Steckboard zulegen soll. Ich glaube das lasse ich im moment aber, meins ist Groß genug. Was für Wärmesensoren soll ich nehmen?
 
Der Schaltplan - MAX232

Hi Kani,

hier der Schaltplan ...
MAX232.png
Die Buchse kommt so in den COM-Port am PC oder am USB-RS232-Dongle.
Die Elkos für die Ladungspunpen sind jetzt auf 1uF (C3..C6)
Der Elko C1 kann auch noch auf 10uF hochgesetzt werden oder auf 1uF bleiben.
Die Werte sind aber alle nicht ganz so kritisch (so zwischen 1uF..10uF paßt).
Der Keramikkondensator C2 blockt HF-Störungen weg.
C2 muß keine Keramik-Scheibe sein. Ich benutze da immer Sibatit- oder
Vielschicht-Kondensatoren Z5U oder X7R , wobei Z5U absolut reicht. Zum
Abblocken ist es egal ob man 10% oder 20% Toleranz beim Wert hat. Und
das sind 0,06eur Unterschied pro Stk. Das bringt bei 100Stk schon ein wenig
(6,- oder 12,- ist schon ein Unterschied bei 100Stk).
Bei den Elkos nehme ich immer "Subminiator-Elkos Radial" 1uF/63V 0,07/Stk

Achja ... Die offenen Pins müssen dich nichht stören. Nach meinen Infos
werden die im MAX232 auf definierten Pegel gebracht. Machen bei meinen
Schaltungen auf jeden Fall keine Probleme. Und notfalls kannst Du damit
noch ne 2te RS232 aufbauen :D

Viel Spaß beim basteln ... :D

und nun ruft das Bett ... :sleep:

Gruß
Dino
 
hi,

mit welchem programm hast du den schaltplan gezeichnet, wenn ich mal fragen darf.

gruß
jens
 
Wo er recht hat, hat er recht ...

Sieht ganz nach EAGLE aus. www.cadsoft.de . Da gibts ne kostenlose Light-Version.

stimmt ! :D ist auch die Light-Version. Die kann aber nur 2 Layer (sollten wohl
reichen :D ) aber auch nur 80x100mm (Halbe Eurokarte). Es müssen aber
anscheinend nur die Greifer (die Kreuze) der Bauteile innerhalb dieser halben
Eurokarte liegen. Ich bin aber am überlegen, mir ne Privat-Version zu
besorgen. Die kann dann volle Eurokarten-Größe.

EAGLE ist eigentlich recht einfach zu bedienen. Ich hab es auf jeden Fall
ohne lesen von Anleitungen geschafft.

Gruß
Dino
 
Jap ich auch. Ein bisschen eingeklickt und dann läuft das.

Irgendwie komme ich mit dem USART nicht klar. Ich glaube die Codebeispiele sind zu hoch für mich.
Soweit bin ich jetzt


CodeBox C

#include <avr/io.h>

/*########## USART initialisieren ##########*/

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRHn = (unsigned char)(baud>>8);
UBRRLn = (unsigned char)baud;

/* Enable receiver and transmitter */
UCSRnB = (1<<RXENn)|(1<<TXENn);

/* Set frame format: 8data, 2stop bit */
UCSRnC = (1<<USBSn)|(3<<UCSZn0);
}
Der Code ist aus dem Datenblatt des ATMEGA644.

Danach geht es weiter mit receive and transmit. Also empfangen und senden. Da fängt es an zu hapern. Also es gibt ein Buffer der die Daten erst sammelt/zwischenspeichert, bis eine Reihe/Kette voll ist und dann sendet oder?
 
Hi Kani,

Irgendwie komme ich mit dem USART nicht klar. Ich glaube die Codebeispiele sind zu hoch für mich.
Soweit bin ich jetzt


CodeBox C

#include <avr/io.h>

/*########## USART initialisieren ##########*/

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRHn = (unsigned char)(baud>>8);
UBRRLn = (unsigned char)baud;

/* Enable receiver and transmitter */
UCSRnB = (1<<RXENn)|(1<<TXENn);

/* Set frame format: 8data, 2stop bit */
UCSRnC = (1<<USBSn)|(3<<UCSZn0);
}
Der Code ist aus dem Datenblatt des ATMEGA644.
UBRRHn , UBRRLn , UCSRnB , UCSRnC ...
Der Buchstabe "n" ist klein geschrieben. Ganz im Gegensatz zu den restlichen
Buchstaben. Und "n" wird auch gerne als Nummerierung genommen. Also
müßte das heißen ... UBRRH0 , UBRRH1 , UCSR0B , UCSR1B , ...
Aber ACHTUNG ! Das ist nicht bei allen ATmegas so. Also sieh in der Register
Summary hinten im Datenblatt nach welche Register und Bits der ATmega
wirklich hat. Bei manchen hast du eine Ziffer drin und bei manchen nicht.
Da bin ich beim ATmega48 auch das erste mal drauf reingefallen. Der
ATmega32 und der ATmega48 haben beide nur einen USART aber beim
32 haben die Register keine Ziffer dazwischen und beim 48 haben sie eine
Null mit drin.

Der ATmega8515 hat keine Ziffern drin.

Hier mal ein Beispiel und Erklärung der Register und Bits in Assembler von
mir. Das mußt Du nur etwas in C umsetzen. ...


CodeBox ASM

; ==================================================================
; ===== USART initialisieren (9k6 8n1) =============================
; ==================================================================
usartinit:
push r16 ; r16 auf Stack retten (fuer wiederherstellung)
;
; ===== BAUDRATE fuer USART =====
;
; U2X=0 Baud = fosc / 16(UBBR+1) , UBBR = ( fosc / 16Baud )-1
; U2X=1 Baud = fosc / 8(UBBR+1) , UBBR = ( fosc / 8Baud )-1
; Baud = bps , fosc = SystemClock , UBBR = UBBRH+UBBRL (0-4095)
;
; 9600 Baud => bei U2X=1 UBBR=207,33 @16MHz
;
; UBRRL - USART Baud Rate Register Low Byte
; * Bit 0..7 : USART Baud Rate Register bit 0..7
;
; UBRRH - USART Baud Rate Register High Byte
; * Bit 0 : USART Baud Rate Register bit 8
; * Bit 1 : USART Baud Rate Register bit 9
; * Bit 2 : USART Baud Rate Register bit 10
; * Bit 3 : USART Baud Rate Register bit 11
; * Bit 4 : 0
; * Bit 5 : 0
; * Bit 6 : 0
; * Bit 7 : USRSEL (Register Select) 1=UCSRC 0=UBRRH
;
ldi r16,0 ; Baudrate-Register HighByte
out UBRRH,r16 ; Highpart = 0
ldi r16,207 ; Baudrate-Register LowByte
out UBRRL,r16 ; Lowpart = 207
;
; UCSRA - USART Control and Status Register A
; * Bit 0 : MPCM Multi-processor Communication Mode
; * Bit 1 : U2X Double the USART transmission speed
; * Bit 2 : UPE Parity Error
; * Bit 2 : PE = UPE For compatibility
; * Bit 3 : DOR Data overRun
; * Bit 4 : FE Framing Error
; * Bit 5 : UDRE USART Data Register Empty
; * Bit 6 : TXC USART Transmitt Complete
; * Bit 7 : RXC USART Receive Complete
; 76543210
ldi r16,0b00000010 ; U2X=1
out UCSRA,r16 ;
;
; URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
; 7 6 5 4 3 2 1 0 UCSRC
;
; UCSRC - USART Control and Status Register C
; * Bit 0 : UCPOL Clock Polarity
; * Bit 1 : UCSZ0 Character Size Bit 0
; * Bit 2 : UCSZ1 Character Size Bit 1
; * Bit 3 : USBS Stop Bit Select 0 = 1Stop-Bit , 1 = 2 Stop-Bits
; * Bit 4 : UPM0 Parity Mode Bit 0
; * Bit 5 : UPM1 Parity Mode Bit 1
; * Bit 6 : UMSEL USART Mode Select Async=0 Sync=1
; * Bit 7 : URSEL Register Select
;
; UPM 00 Disabled UCSZ 000 5-Bit , 100 Reserved
; 01 Reserved 001 6-Bit , 101 Reserved
; 10 Even Parity 010 7-Bit , 110 Reserved
; 11 Odd Parity 011 8-Bit , 111 9-Bit
;
; SyncMode TxD Changed RxD Sampled
; UCPOL 0 Rising XCK Edge Falling XCK Edge
; 1 Falling XCK Edge Rising XCK Edge
; 76543210
ldi r16,0b10000110 ; URSEL=1 (UCSRC) , USBS=0 UCSZ=3 => Frame-Format 8Bit/1Stop
out UCSRC,r16 ;
;
; UCSRB - USART Control and Status Register B
; * Bit 0 : TXB8 Transmit Data Bit 8
; * Bit 1 : RXB8 Receive Data Bit 8
; * Bit 2 : UCSZ2 Character Size Bit 2
; * Bit 2 : CHR9 = UCSZ2 For compatibility
; * Bit 3 : TXEN Transmitter Enable
; * Bit 4 : RXEN Receiver Enable
; * Bit 5 : UDRIE USART Data register Empty Interrupt Enable
; * Bit 6 : TXCIE TX Complete Interrupt Enable
; * Bit 7 : RXCIE RX Complete Interrupt Enable
; 76543210
ldi r16,0b00011000 ; UCSZ2=0 (8Bit) , TXEN + RXEN => Enable Receiver/Transmitter
out UCSRB,r16 ;

pop r16 ; r16 wiederherstellen
ret ; Subroutine Ende


Danach geht es weiter mit receive and transmit. Also empfangen und senden. Da fängt es an zu hapern. Also es gibt ein Buffer der die Daten erst sammelt/zwischenspeichert, bis eine Reihe/Kette voll ist und dann sendet oder?

Der USART hat ein Register "UDR" USART-Data-Register. Das sind eigentlich
zwei Register. Wenn du Daten liest, dann kommen die aus dem Empfangsteil
des UDR und wenn du Daten schreibst, dann gehen die an den Sendeteil
vom UDR. Er ist also getrennt in Sende- und Empfangsregister. das eine
wird beim lesen angesprochen und das andere beim schreiben.

Sieh dir mal das USART-Block-Diagram im Datenblatt an. Da ist das gut
zu sehen.

Das was du ins Senderegister schreibst wird auf der TxD rausgeschoben.
Was auf der RxD empfangen wird, das landet im Empfangsregister. Das
besteht aus so einem kleinen Zwischenpuffer (FIFO - First In First Out)
von ein paar wenigen empfangenen Zeichen. Wenn es keinen Zwischenpuffer
hätte, dann müßtest Du sofort reagieren, wenn was empfangen wird, damit
das nächste empfangene Byte nicht ins Nirwana läuft (weil das Empfanngs-
register wäre ja noch voll). Darum ist da so ein kleiner FIFO drin. Frag mich
jetzt nicht wie viele Byte der zwischenpuffert (meißt so 4, 8, oder 16).
Also nichts weiter als ne Warteschlange. Ob der Sendepuffer schon wieder
frei ist oder der Empfangspuffer was empfangen hat kannst Du an den
Statusbits im Register UCSRA sehen. Bit 5 => 1 = Sendepuffer leer , Du
kannst wieder was zum senden in den Sendepuffer schreiben.
Bit 7 => 1 = Es ist was im Empfangspuffer was du lesen kannst.

Hier nochmal meine Routinen ...


CodeBox ASM

; ==================================================================
; ===== USART - Daten senden =======================================
; ==================================================================
usartwr: ; Warten auf leeren Sendepuffer
sbis UCSRA,5 ; Skip if Bit 5 is Set : UDRE USART Data Register Empty
rjmp usartwr ; Sende-Buffer noch nicht leer
out UDR,r16 ; Daten (r16) in Sendepuffer schreiben => wird gesendet
ret ; Subroutine Ende


; ==================================================================
; ===== USART - Daten empfangen ====================================
; ==================================================================
usartrd: ; Warten auf Daten im Empfangspuffer
sbis UCSRA,7 ; Skip if Bit 7 is Set : RXC USART Receive Complete
rjmp usartrd ; Noch nichts empfangen
in r16, UDR ; Daten aus Empfangspuffer in r16 einlesen
ret ; Subroutine Ende

Das war es eigentlich soweit. ...

Gruß
Dino
 
Soo, das Programm habe ich in zusammenarbeit mit Nomis verstanden. Die einzelnen Teile kenne ich, ich weiß nur nie wie ich sie insgesammt verstehen soll.

Reichelt war auch da. Neues Steckboard paar Kondensatoren und das übliche. Hab schon alles montiert. Jetzt fehlt nurnoch das Pollin da war und mir den Dongle und die 1µF Kondensatoren vorbeibringt. :p
 
Hi Kani,

Soo, das Programm habe ich in zusammenarbeit mit Nomis verstanden. Die einzelnen Teile kenne ich, ich weiß nur nie wie ich sie insgesammt verstehen soll.

bau doch mal folgendes ...

- Am Anfang natürlich die Initialisierung des USART
- und dann in der Hauptschleife ...
1. Von USART lesen
2. und wenn was drin war dann wieder wegsenden.

Damit hast du ein Echo gebaut. Der ATmega empfängt und sendet die
empfangenen Daten wieder zurück zum PC. Wenn die getippten Zeichen
im Terminalfenster erscheinen dann weißt Du das dein Programm funktioniert.

Wenn es nicht funktioniert tippst du blind (es ist also nix zu sehen).

Das ist der erste Schritt zu einer Komunikation mit dem ATmega.

Du mußt also den Sendeteil in den Empfangsteil einbauen.
sieht in Assembler so aus ...


CodeBox ASM

; ==================================================================
; ===== USART - Daten senden/empfangen (Echo) ======================
; ==================================================================
usartecho: ; Wait for data to be received (ca 1ms bei 9k6/8n1)
ldi r16,0x00 ; 0x00 als Leermeldung laden (nix empfangen)
sbis UCSRA,7 ; Skip if Bit 7 is Set : RXC USART Receive Complete
rjmp usartechoend ; Noch nichts empfangen
in r16, UDR ; Get and return received data from buffer
usartechowr:
sbis UCSRA,5 ; Skip if Bit 5 is Set : UDRE USART Data Register Empty
rjmp usartechowr ; Sende-Buffer noch nicht leer
out UDR,r16 ; Put data (r16) into buffer, sends the data
usartechoend:
ret ; Subroutine Ende

Mußt Du jetzt nur noch in C umsetzen ... :D



CodeBox C

/* Hier die Initialisierung */

while(1) /* Hauptschleife */
{

/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
{
/* Get and return received data from buffer */
data = UDR;
}

/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
{
/* Put data into buffer, sends the data */
UDR = data;
}

}

Hi Nomis, ist das so richtig in der Hauptschleife ? Hab ich gerade mal aus dem
Datenblatt von nem Mega8515 in 5 Minuten zusammengepastet :D Und dabei
kann ich doch gar kein C :rolleyes:

Gruß
Dino
 
Hi Nomis, ist das so richtig in der Hauptschleife ? Hab ich gerade mal aus dem
Datenblatt von nem Mega8515 in 5 Minuten zusammengepastet :D Und dabei
kann ich doch gar kein C :rolleyes:

Jep sieht toll aus. Bis auf:
Das hier


CodeBox C

/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
{
//solange keine Daten angekommen sind werden die Daten aus dem
//Puffer ausgelesen. (das ist nicht das was wir wollen)
/* Get and return received data from buffer */
data = UDR;
}

sollte eher so


CodeBox C

/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
{
//solange keine Daten angekommen sind passiert nichts.
}
/* Get and return received data from buffer */
data = UDR;


aussehen



Kani hat sich aber jetzt einen 644er bestellt bei dem die Register und Bits des USARTs etwas anders heißen.
 
Hallo zusammen,

Kani hat sich aber jetzt einen 644er bestellt bei dem die Register und Bits des USARTs etwas anders heißen.
nicht nur das !

1. Das Teil verträgt 20MHz
2. Sehr viele Register sind Memory-Mapped !!! (Bei Assembler zu beachten)

Ach ja .... Muß dann in die While kein NOP rein, damit sie nicht wegrationalisiert wird ?

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)